【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这一处理机制,也引发了一些让人苦恼的小问题。我们先来看看底层的源码定义:
案例一:
案例的逻辑很简单,只是将两值传入areIntsDifferent()进行判断,返回后传给boolString进行转成字符串的格式输出。
案例二:
如果不看我贴出来的效果图,你能想象到效果竟然也是这个样子么。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语言的一个超集,但也有自己的风格所在,一般我们进判断的写法如下所示:
这里附上一个小小的技巧,开发中有时候有我们进行测试BOOL值难道也要进行写个方法判断 NO和YES再转成NSString对象输出到NSLog???如果每次这样那不就太不科学了吧。Ok,下面给出自己常用的解决方法:
OK.现在对于Objective-C的BOOL是不是一清二楚了。好、关于Objective-C的BOOL的解析就分享至此结束。
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的解析就分享至此结束。
相关文章推荐
- bool当成函数参数错误理解
- Objective-C的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中NSLog输出格式大全
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(二)
- objective-c(三)
- objective-c(四)-基本数据类型以及循环和选择结构
- objective-c(六)文件分离,合成存取方法,方法多参数,局部变量,self使用(未完成)