Ste*_*ser 9 null cocoa cocoa-touch boolean objective-c
根据Mike Ash的博客文章,由于指针大于BOOL,因此转换为BOOL可能会失败6%的时间.因此,他建议如果你正在检查一个物体是否存在,你应该检查是否为零
if (self != nil) {
而不是Apple模板的功能
if (self) {
Apple的模板是否包含一个bug或者是否有其他一些我不知道的语法糖?
小智 12
因为他们投了BOOL
不,他们没有.根本没有表演.但是,将表达式评估为逻辑值.对于指针(指针nil和指针self),NULL指针的计算结果为false,其他任何指针都为true.这不是一个错误,只是一种速记方式,它完全有效C.
关于为什么人们可能想要对NULL或进行明确的比较nil:在某些情况下,它可能更具可读性,特别是如果乍看之下表达式的类型和范围并不明显.然而,在Objective-C和Cocoa中,构造函数中的这种常见习惯就是这样,任何有经验的程序员都会毫无问题地掌握它.
Objective-C 基于 C,并且在 C 中,该if语句确实不对布尔值进行操作,这也许令人惊讶。
C 有一个类型层次结构:
char和枚举 ( enum) 类型是整数类型float和double是真正的浮动long double类型唷!
现在该if声明采用以下形式之一:
if ( expression ) statement
if ( expression ) statement else statement
其中表达式必须是任何标量类型。如果表达式比较不等于 0,则执行第一条(或唯一一条)语句,第二条语句(如果存在)语句;如果表达式比较等于 0,则执行第二个(如果存在)语句。
所以:
if (self) ...
和
if (self != nil) ...
结果相同。
第一个表达式self是某种指针类型,它是标量类型,并比较是否不等于指针类型的零(在代码中表示为nil)。第二个表达式self != nil是一个等式表达式,并产生类型 的0or ,这也是标量类型1int...
因此,从技术上讲,第二种形式涉及值的中间生成int,但编译器实际上不会生成值(当然,除非您将表达式的结果分配给变量)。
笔记:
if ( sin( angle ) ) ...是有效的......switch语句对整数类型而不是标量类型进行操作华泰