您的位置:首页 > 移动开发 > Objective-C

【Obective-C编程开发】Objective-C之BOOL一清二楚

2015-08-08 16:20 417 查看
无论我们是在游戏开发或者应用开发,布尔类型是不可或缺的数据类型,我们知道布尔类型一般表现为真值或者假值,但是在不同的编程语言,布尔类型却有不同的表现。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的解析就分享至此结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC objective-c BOOL