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