Justin Spahr-Summers Macro如何更安全地进行键值编码工作?
https://gist.github.com/jspahrsummers/1670404
#define ObjectKeyPath(OBJECT, KEYPATH) \
((void)(NO && ((void)OBJECT.KEYPATH, NO)), @ # KEYPATH )
这个子表达式的结果是什么?
(NO && ((void)OBJECT.KEYPATH, NO))
这部分宏做了什么?
@ # KEYPATH
答案 0 :(得分:1)
(void)(NO && ((void)OBJECT.KEYPATH, NO))
让我们从内到外解决这个问题。
((void)OBJECT.KEYPATH, NO)
这是一个使用逗号运算符的表达式,它始终返回列表中的最后一个值。在这种情况下,最后一个值为NO
。列表中的第一项转换为对命名属性的访问。如果作为宏的第二个操作数给出的字符串是错误的,这将导致编译器错误。
接下来,此子表达式用作布尔表达式的右侧,其第一项始终求值为false。这样做的原因是为了使编译器关于访问getter的副作用的警告静音。这是有效的,因为编译器知道后半部分永远不会执行。
最后,在第一部分和密钥名称之间使用逗号运算符。
@ # KEYPATH
构造一个常量NSString
。