Justin Spahr-Summers Macro如何实现更安全的键值编码工作?

时间:2016-08-03 14:25:20

标签: ios objective-c

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

1 个答案:

答案 0 :(得分:1)

(void)(NO && ((void)OBJECT.KEYPATH, NO))

让我们从内到外解决这个问题。

((void)OBJECT.KEYPATH, NO)

这是一个使用逗号运算符的表达式,它始终返回列表中的最后一个值。在这种情况下,最后一个值为NO。列表中的第一项转换为对命名属性的访问。如果作为宏的第二个操作数给出的字符串是错误的,这将导致编译器错误。

接下来,此子表达式用作布尔表达式的右侧,其第一项始终求值为false。这样做的原因是为了使编译器关于访问getter的副作用的警告静音。这是有效的,因为编译器知道后半部分永远不会执行。

最后,在第一部分和密钥名称之间使用逗号运算符。

@ # KEYPATH构造一个常量NSString