自动提示宏:能在输入宏的时候像属性一样让Xcode有提示功能
一.宏代码:
#define keyPath(objc,keyPath) @(((void)objc.keyPath,#keyPath))
比如监听view的frame的变化
不使用自动提示宏:
[self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
使用自动提示宏:
[self.view addObserver:self forKeyPath:keyPath(self.view, frame) options:NSKeyValueObservingOptionNew context:nil];
二.推导过程:
- 第一步:定义一个宏
#define keyPath(objc,keyPath) (objc.keyPath,keyPath)
宏的操作原理:每输入一个子母就会直接将宏右边的拷贝,并且会自动补齐前面的内容。
- 第二步:将宏变成字符串
#define keyPath(objc,keyPath) (objc.keyPath,#keyPath)
在宏里面添加一个#号,宏里面的#会自动将后面的参数变成C语言的字符串。但是,会有警告⚠️
- 第三步:去除警告
警告的原因:还有一个结果没有使用。
(objc.keyPath,#keyPath)是个逗号表达式,逗号表达式只取后面的值,所以给第一个值加void,强转类型为void,表示不使用第一个值的结果。
#define keyPath(objc,keyPath) ((void)objc.keyPath,#keyPath)
- 第四步:将C语言字符串转换成OC字符串使用 @(C语言字符串)
#define keyPath(objc,keyPath) @(((void)objc.keyPath,#keyPath))
注意:括号一个不能少。
这样
((void)objc.keyPath, #keyPath)
就会返回#keyPath
内容,keyPath 就是我们对象的属性,但是这个时候返回的是属性,因为宏定义是 C 语言的内容所以我们先需要将内容转换为 C 语言的字符串,也就是#keyPath。这个时候返回的是 C 语言的字符串,而我们想要的是 OC 的字符串,直接使用 @()这个语法 就可以了。