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

无论我们是在游戏开发或者应用开发,布尔类型是不可或缺的数据类型,我们知道布尔类型一般表现为真值或者假值,但是在不同的编程语言,布尔类型却有不同的表现。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的解析就分享至此结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值