《编写高质量代码:改善Objective-C程序的61个建议》——建议16:明智而审慎地使用BOOL类型

简介:

本节书摘来自华章出版社《编写高质量代码:改善Objective-C程序的61个建议》一 书中的第2章,作者:刘一道,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议16:明智而审慎地使用BOOL类型

整型转换为BOOL 型时,要小心,不要直接和YES作比较。
BOOL 在Objective-C里被定义为unsigned char,这意味着它不仅仅只有YES(1)和NO(0)两个值。不要直接把整型强制转换为BOOL 型。常见的错误发生在把数组大小、指针的值或者逻辑位运算的结果赋值到BOOL型中,而这样就导致BOOL 值仅取决于之前整型值的最后一个字节,有可能出现整型值不为0但被转为NO的情况。因此把整型转为BOOL型的时候请使用三元(Ternery)操作符,保证返回YES 或NO 值。
在BOOL、_BOOL 及bool(见C++ Std 4.7.4、4.12及C99 Std 6.3.1.2)之间可以安全地交换值或转型。但BOOL 和Boolean 之间不可以,所以对待Boolean 就像上面讲的整型一样就可以了。在Objective-C函数签名里仅使用BOOL 。
对BOOL值使用逻辑运算(&&, ||, !)都是有效的,返回值也可以安全地转为BOOL型而不需要三元(Ternery)操作符。

// AVOID  
- (BOOL)isBold {  
  return [self fontTraits] & NSFontBoldTrait;  
}  
- (BOOL)isValid {  
  return [self stringValue];  
}  
  
// GOOD  
- (BOOL)isBold {  
  return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;  
}  
- (BOOL)isValid {  
  return [self stringValue] != nil;  
}  
- (BOOL)isEnabled {  
  return [self isValid] && [self isBold];  
}  

还有,不要把BOOL 型变量直接与YES 比较。这样不仅对于精通C的人很有难度,而且此条款的第一点也说明了这样做未必能得到你想要的结果。

// AVOID  
BOOL great = [foo isGreat];  
if (great == YES)  
  // ...be great!  
  
// GOOD  
BOOL great = [foo isGreat];  
if (great)  
  // ...be great!  

 要点
(1)整型转为BOOL型,使用三元(Ternery)操作符,以保证返回YES 或NO 值。
(2)整型转换为BOOL型的时候要避免直接和YES做比较。
(3)BOOL值进行逻辑运算(&&, ||, ! )不但有效,而且还可以确保返回值安全地转为BOOL型,无须三元(Ternery)操作符。

相关文章
|
程序员 iOS开发
《编写高质量代码:改善Objective-C程序的61个建议》——导读
我一直在思考,如何才能编写出高质量、优秀的代码,我也在不停地探寻,希望找出类似于武侠小说中所说的武功秘籍,在编写代码一途可以帮助大家走“捷径”从而达到事半功倍的效果。
1040 0
|
iOS开发
Objective-C特有类型——id
Objective-C特有类型——id OC里,id和int、double等一样,是一个类型 不同的是: id是一个万能指针,能指向/操作任何OC对象 相当于 (NS...
731 0
|
Shell Linux C语言
Windows 下使用 GNUstep 编译并运行 Objective-C 程序
今晚上开始看《Objective-C 程序设计(第4版)》这本书(OSChina 正在做此书的书评活动,详情请看这里),到现在为止看到第 7 章,于是想动手试试写两简单的程序编译跑跑看。
1297 0
|
iOS开发
【《Objective-C基础教程 》笔记ch02】(二)Boolean类型及实例
一、布尔类型         布尔类型是一种对带符号的字符类型(signed char)的类型定义,使用8位的存储空间。         通过#define指令把YES定义为1,NO定义为0,都是8位的二进制数。
969 0
|
iOS开发
Objective-C - 类型
1. Strings 1) 简单字符串 NSString *aString = @"this is a string"; NSString *anotherString = @"and this is another one"; 2) 对象初始化 NSString *aStri...
584 0