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

2017-01-13 21:18:42 +08:00
 lalalafq

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

# Person.h

@interface Person : NSObject

@property (nonatomic,copy)NSString * name;

@property (nonatomic,copy)NSString * qq;

@end

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

2362 次点击
所在节点    iOS
13 条回复
chaselen
2017-01-14 14:25:56 +08:00
#define genMethod(className) - (className *)get##className##ByName:(NSString *)name;
chaselen
2017-01-14 14:26:54 +08:00
genMethod(Object) 就会展开成 -(Object *)getObjectByName:(NSString *)name;
xiubin
2017-01-14 14:39:24 +08:00
估计只有我闲的没事才回回复楼主?

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

你是要表达这个意思吗?

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

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

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

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

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

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

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

当然在宏里定义宏是不允许的,你可能需要写一个工具来完成第一次展开
XDDD
2017-01-16 21:14:01 +08:00
另外我觉得你可能需要练习一下表达能力……这明显是一个关于宏的黑魔法的问题,然而题目里完全看不出来……
lalalafq
2017-01-17 13:20:31 +08:00
@XDDD 感谢指导~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334467

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX