自动提示`宏`
2016-05-07 本文已影响69人
闲得一B
自动提示宏:能在输入宏的时候像属性一样让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))
注意:括号一个不能少。