无论我们是在游戏开发或者应用开发,布尔类型是不可或缺的数据类型,我们知道布尔类型一般表现为真值或者假值,但是在不同的编程语言,布尔类型却有不同的表现。C语言:实际上,C语言并不具备布尔类型,但是一般定义0为假值,非0值是真值, 所以int类型与布尔类型可谓难兄难弟,可以互相转换;而在java语言:int类型与布尔类型却是不能互相转换,存储的值只有true或者false值;最后看看Objective-C语言:它具有有的是YES和NO值,这两个值只是一种约定,编译器将BOOL类型认作8位的二进制数,所以Objective-C并不将BOOL作为仅能保存YES或NO值的真正布尔类型来处理,正因为Objective-C这一处理机制,也引发了一些让人苦恼的小问题。我们先来看看底层的源码定义:
typedef signed char BOOL;
#define YES (BOOL) 1
#define NO (BOOL) 0
可以看到BOOL中的YES被定义为1,BOOL的NO被定义为0
案例一:
#import <Foundation/Foundation.h>
BOOL areIntsDifferent (int thing1, int thing2)
{
if(thing1 == thing2)
{
return (NO);
} else {
return (YES);
}
}
NSString *boolString (BOOL yesNo)
{
if(yesNo == NO)
{
return (@"NO");
} else {
return (@"YES");
}
}
int main (int argc, const char * argv[])
{
BOOL areTheyDifferent;
areTheyDifferent = areIntsDifferent (5, 5);
NSLog(@"are %d and %d different? %@", 5, 5, boolString(areTheyDifferent));
areTheyDifferent = areIntsDifferent (23, 42);
NSLog(@"are %d and %d different? %@", 23, 42, boolString(areTheyDifferent));
return 0;
}
效果图:
案例的逻辑很简单,只是将两值传入areIntsDifferent()进行判断,返回后传给boolString进行转成字符串的格式输出。
案例二:
#import <Foundation/Foundation.h>
BOOL areIntsDifferent_faulty(int thing1,int thing2)
{
return thing1-thing2;
}
int main (int argc, const char * argv[])
{
if(areIntsDifferent_faulty(23, 5)==YES)
{
NSLog(@"Are %d and %d different? %d YES",23,5,areIntsDifferent_faulty(23, 5));
}
else {
NSLog(@"Are %d and %d different? %d NO",23,5,areIntsDifferent_faulty(23, 5));
}
if(areIntsDifferent_faulty(23, 5))
{
NSLog(@"Are %d and %d different? %d YES",23,5,areIntsDifferent_faulty(23, 5));
}
else {
NSLog(@"Are %d and %d different? %d NO",23,5,areIntsDifferent_faulty(23, 5));
}
return 0;
}
效果图:
如果不看我贴出来的效果图,你能想象到效果竟然也是这个样子么。NO,这绝对的不科学,OK,现在我们就这个无数人编程经常犯错的案例进行解析。
解析步骤:
a. BOOL中的YES对应1,BOOL的NO对应0
b.23-5与YES比较== 23-5与1比较。肯定不等于,直接到else输出为NO
c.23-5直接在if条件判断框进行判断,这样 if(areIntsDifferent_faulty(23, 5))的写法我们来回顾C语言,只要不为0就直接执行,所以直接进行YES
整个流程就是这样,在OC中切忌与C语言进行混乱,虽然Oc是C语言的一个超集,但也有自己的风格所在,一般我们进判断的写法如下所示:
//第一种常见写法
if(areIntsDifferent_faulty(23, 5)==NO)
{
//NO
}
else {
//YES
}
//第二种常见写法
if(areIntsDifferent_faulty(23, 5))
{
//YES
}
else {
//NO
}
这里附上一个小小的技巧,开发中有时候有我们进行测试BOOL值难道也要进行写个方法判断 NO和YES再转成NSString对象输出到NSLog???如果每次这样那不就太不科学了吧。Ok,下面给出自己常用的解决方法:
//BOOL快速转NSString
BOOL b=YES;
NSLog(@"BOOL: %@",b?@"YES":@"NO");
运行效果图:
OK.现在对于Objective-C的BOOL是不是一清二楚了。好、关于Objective-C的BOOL的解析就分享至此结束。