BOOL 若干陷阱
Tip
将普通整形转换成 BOOL
时要小心。不要直接将 BOOL
值与 YES
进行比较。
Ojbective-C 中把 BOOL
定义成无符号字符型,这意味着 BOOL
类型的值远不止 YES
。常见的错误包括将数组的大小、指针值及位运算的结果直接转换成 (1)或</span> <span class="pre">
NO(0)。不要直接把整形转换成</span> <span class="pre">
BOOLBOOL
,取决于整型结果的最后一个字节,很可能会产生一个 NO
值。当转换整形至 BOOL
时,使用三目操作符来返回 YES
或者 NO
。(译者注:读者可以试一下任意的 256 的整数的转换结果,如 256、512 …)
你可以安全在 BOOL
、_Bool
以及 bool
之间转换(参见 C++ Std 4.7.4, 4.12 以及 C99 Std 6.3.1.2)。你不能安全在 BOOL
以及 Boolean
之间转换,因此请把 Boolean
当作一个普通整形,就像之前讨论的那样。但 Objective-C 的方法标识符中,只使用 BOOL
。
对 BOOL
使用逻辑运算符(&&
,||
和 !
)是合法的,返回值也可以安全地转换成 BOOL
,不需要使用三目操作符。
错误的用法:
- - (BOOL)isBold {
- return [self fontTraits] & NSFontBoldTrait;
- }
- - (BOOL)isValid {
- return [self stringValue];
- }
正确的用法:
- (BOOL)isBold {return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;}- (BOOL)isValid {return [self stringValue] != nil;}- (BOOL)isEnabled {return [self isValid] && [self isBold];}
同样,不要直接比较 YES/NO
和 BOOL
变量。不仅仅因为影响可读性,更重要的是结果可能与你想的不同。
错误的用法:
- BOOL great = [foo isGreat];
- if (great == YES)
- // ...be great!
正确的用法:
- BOOL great = [foo isGreat];
- if (great)
- // ...be great!