V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lalalafq
V2EX  ›  iOS

Objective-C 在头文件里能否是用宏得到类名称

  •  
  •   lalalafq · 2017-01-13 21:18:42 +08:00 · 2198 次点击
    这是一个创建于 2658 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道这样描述是否正确,举个例子:

    # Person.h

    @interface Person : NSObject

    @property (nonatomic,copy)NSString * name;

    • (Person *)getPersonByName:(NSString *)name;

    @property (nonatomic,copy)NSString * qq;

    • (Person *)getPersonByQQ:(NSString *)qq;

    @end

    定义一个 name ,下面有个方法是通过 name 得到某个 Person 对象。 实现效果: name 属性已经用代码写好,使用宏来实现方法的申明[输入 name ,得到- (Person *)getPersonByName:(NSString *)name ],但是现在遇到的问题就是这个 Person 用怎么样宏去替换。求教育~

    13 条回复    2017-01-17 13:20:31 +08:00
    chaselen
        1
    chaselen  
       2017-01-14 14:25:56 +08:00
    #define genMethod(className) - (className *)get##className##ByName:(NSString *)name;
    chaselen
        2
    chaselen  
       2017-01-14 14:26:54 +08:00
    genMethod(Object) 就会展开成 -(Object *)getObjectByName:(NSString *)name;
    xiubin
        3
    xiubin  
       2017-01-14 14:39:24 +08:00
    估计只有我闲的没事才回回复楼主?

    “ Objective-C 在头文件里能否是用宏得到类名称” -> “ Objective-C 在头文件里是否能用宏得到类名称”

    你是要表达这个意思吗?

    另外,建议楼主看下 markdown ,你直接贴代码 "-"会被解析成 “·”

    最后 "- (Person *)getPersonByName:(NSString *)name;"这怎么看都是类方法比实例方法更合适一点吧?

    楼主写的东西自己看得懂吗?我是没看懂,建议整理一下。
    lalalafq
        4
    lalalafq  
    OP
       2017-01-14 18:11:26 +08:00
    @chaselen 我输入的是参数的 name ,不是 classname , classname 想通过宏得到
    lalalafq
        5
    lalalafq  
    OP
       2017-01-14 18:13:42 +08:00
    @xiubin 感谢
    1.标题多打了个“是”,正确表达是“ Objective-C 在头文件里能否用宏得到类名称”
    2.方法意义不用管。

    总结一下,就是在头文件中使用宏定义得到类名称
    xiubin
        6
    xiubin  
       2017-01-14 18:40:49 +08:00
    “[输入 name ,得到- (Person *)getPersonByName:(NSString *)name ]”

    你输入 name ,怎么能得到这个?好歹你得先有个 Person 对象才能调用这个方法吧?

    “总结一下,就是在头文件中使用宏定义得到类名称”,单看这一句,实在不能明白你得意思,不妨你举个例子吧,你怎么写,输出什么。。?
    HelloiWorld
        7
    HelloiWorld  
       2017-01-14 23:49:18 +08:00 via iPhone
    不知道怎么用宏,感觉 runtime 应该能做到
    还是去 so 站问答案来的快一点
    XDDD
        8
    XDDD  
       2017-01-15 14:08:24 +08:00 via iPhone
    @xiubin 他的意思应该是用宏自动生成方法

    把 ClassName 作为参数传进去不行吗
    lalalafq
        9
    lalalafq  
    OP
       2017-01-16 09:14:59 +08:00
    @XDDD 对的,您明白我的意思。我现在想实现的就是不输入 ClassName 用宏自动生成,可能有 n 多文件要这么用。
    lalalafq
        10
    lalalafq  
    OP
       2017-01-16 09:16:22 +08:00
    @HelloiWorld 因为在头文件做申明使用,用不来运行时,所以在编译的时候就要知道 ClassName
    XDDD
        11
    XDDD  
       2017-01-16 21:10:19 +08:00 via iPhone
    这是我能想到的方法:
    写一对 CLASS_BEGIN 和 CLASS_END 宏来替换原有 @interface ,在 CLASS_BEGIN 里 define 一个 CLASS_NAME ,在 CLASS_END 里 undef 掉。这样你就可以在 method 里使用 CLASS_NAME 了

    当然在宏里定义宏是不允许的,你可能需要写一个工具来完成第一次展开
    XDDD
        12
    XDDD  
       2017-01-16 21:14:01 +08:00 via iPhone
    另外我觉得你可能需要练习一下表达能力……这明显是一个关于宏的黑魔法的问题,然而题目里完全看不出来……
    lalalafq
        13
    lalalafq  
    OP
       2017-01-17 13:20:31 +08:00
    @XDDD 感谢指导~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5311 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:00 · PVG 16:00 · LAX 01:00 · JFK 04:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.