目标C中的各种布尔值

时间:2013-01-22 17:37:16

标签: ios objective-c

  

可能重复:
  What values should I use for iOS boolean states?

我相信在iOS环境中有类似5种布尔类型(来自C,C ++和Objective C)。

  • _Bool
  • BOOL
  • BOOL
  • boolean_t
  • 布尔

至少有四对值:

  • true,false
  • TRUE,FALSE
  • 是,否
  • 1,0

您认为哪一个最适合(风格明智)用于iOS Objective C开发?

更新1

我提到了一个类型“boolean”。看起来它不存在。我从列表中删除了它并添加了_Bool。

我知道这些类型和值的typedef。问题是关于风格差异。

6 个答案:

答案 0 :(得分:5)

iOS和OS X主要由Cocoa组成,它使用值为BOOL / YES的布尔类型NO

  
bool
  
    
          
  • 由C ++定义。
  •       
  • 一个真正的布尔值,保证为0或1.
  •     
  
  
_Bool
  
    
          
  • 由C99定义。
  •       
  • 一个真正的布尔值,保证为0或1.
  •       
  • 如果包含stdbool.h,则bool #defined为_Bool。
  •     
  
  
BOOL
  
    
          
  • /usr/include/objc/objc.h的Objective-C运行时定义。
  •       
  • 32位的signed char。值可以是YES(0x01),NO(0x00),也可以是-127到128之间的任何值。YES / NO定义在<Foundation/NSObjCRuntime.h>
  •       
  • 64位的bool,保证为0或1.
  •     
  
  
Boolean
  
    
          
  • CFBase.h处的碳定义。
  •       
  • 未签名的字符。
  •       
  • 值可以是TRUE(0x01),FALSE(0x00),也可以是-127到128之间的任何值。
  •     
  
  
boolean_t
  
    
          
  • /usr/include/mach/i386/boolean.h
  • 定义       
  • x32中的int或x64中的unsigned int。
  •     
  

对于非真正的布尔类型:

  • 在逻辑表达式中将任何非零值视为true。
  • 如果转换为范围小于转换类型的布尔类型,则仅使用较低的字节。

很难想象一种或另一种有所作为的情况。有几种情况下,转换为BOOL可能会咬你,以及一些罕见的情况(例如:KVO将BOOL转换为NSNumber,并将bool转换为CFBoolean)。如果有的话,当你一直使用BOOL时,如果Apple更改了它的定义,你将受到保护。

答案 1 :(得分:3)

在Objective-C代码中使用BOOLYES / NO。这是Objective-C代码中的预期,以及Objective-C头如何定义数据类型。 (请注意,您可能偶尔会处理其他类型/值,例如在检查指针的“真实性”或处理时,例如C ++代码,但Objective-C通常使用BOOLYES / NO表示布尔数据类型和值。)

答案 2 :(得分:2)

基本上绝对无动于衷。在实践中,我敢打赌他们甚至以同样的方式宣布:typedef signed char BOOL;typedef signed char Boolean;等。

所以他们实际上是兼容和等同的;但是,最好的方法是尊重期望和返回的类型方法,所以写

[object someObjectiveCMethod:YES];

而不是

[object someObjectiveCMethod:TRUE];

CFWhateverSetBooleanProperty(true);

而不是

CFWhateverSetBooleanProperty(YES);

答案 3 :(得分:2)

将ObjC的BOOL用于ObjC代码。使用他们“原生”的其他人。在阅读代码时,任何其他东西都会突显出“不寻常”并且值得格外小心,这是一个应该保留给实际 不寻常且值得特别小心的代码的属性。

答案 4 :(得分:0)

BOOL,YES,NO。

但是BOOL是signed char,所以YES等于1,NO等于0。


objc.h中,它们被定义为:

typedef signed char BOOL; 

并且

#define YES ((BOOL)1)
#define NO  ((BOOL)0)

答案 5 :(得分:0)

如果不是因为读取代码的人可能不知道这种类型,你可以使用每一个。因此,对于惯例,请使用值BOOL(1)或YES的{​​{1}}。