ObjectiveC中的各种布尔值

3

可能是重复问题:
iOS布尔类型的取值应该使用哪种?

我相信在iOS环境中(源自C、C++和Objective C)有大约5种布尔类型。

  • _Bool
  • bool
  • BOOL
  • boolean_t
  • Boolean

其中至少有四对不同的取值:

  • true, false
  • TRUE, FALSE
  • YES, NO
  • 1, 0

你认为使用哪一种最好(从风格上考虑)用于iOS Objective C开发?

更新1

我提到了一种“boolean”类型,但似乎不存在。我已将其从列表中删除并添加了 _Bool。

我知道这些类型和取值可以使用typedef来定义。但本题关注的是风格方面的差别。


2
一般情况下,在编写 Objective-C 代码时应使用 BOOL/YES/NO(和 nil)。但是,如果您正在编写基本上是嵌入式 C/C++ 代码,您可能更喜欢使用您在母语环境中学习的任何 C 语言约定。 - Hot Licks
你在哪里找到了 boolean 类型? - Jano
6个回答

5
iOS和OS X主要由Cocoa构成,其中使用布尔类型BOOL,其取值为YES/NObool
  • 由C++定义。
  • 真正的布尔类型,保证为0或1。
_Bool
  • 由C99定义。
  • 真正的布尔类型,保证为0或1。
  • 如果包含stdbool.h,则将bool #define为_Bool。
BOOL
  • 在Objective-C运行时中由/usr/include/objc/objc.h定义。
  • 32位中的signed char。值可以是YES(0x01),NO(0x00)或范围内的任何值-127到128。YES/NO<Foundation/NSObjCRuntime.h>中定义。
  • 64位中的bool,保证为0或1。
Boolean
  • 在Carbon中由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更改其定义时得到保护。

3

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


2

这基本上是完全无关紧要的。实际上,我打赌它们甚至以相同的方式声明:typedef signed char BOOL;typedef signed char Boolean;等。

因此,它们在实践中是兼容和等效的;然而,最好的方法是尊重类型方法的期望和返回值,所以写:

[object someObjectiveCMethod:YES];

替代

[object someObjectiveCMethod:TRUE];

并且

CFWhateverSetBooleanProperty(true);

替代

CFWhateverSetBooleanProperty(YES);

2

在ObjC代码中使用ObjC的BOOL。在其他地方使用本地的数据类型。其他数据类型往往会显得“不寻常”,在阅读代码时需要额外小心,而这种小心应该保留给那些真正不寻常且值得额外关注的代码。


0

使用 YES 和 NO 的 BOOL。

然而,BOOL 是有符号字符,因此 YES 等于 1,NO 等于 0。


objc.h中,它们被定义为:
typedef signed char BOOL; 

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

1
(以下为编程相关内容,请仅返回翻译后的文本) - user529758
@H2CO3:抱歉,我没听懂你的意思,请纠正我的回答。 - Anoop Vaidya
不,这是正确的,我只是从这里复制的:http://www.opensource.apple.com/source/objc4/objc4-371.1/runtime/objc.h - Anoop Vaidya
1
是的,确实 :) 我很惊讶他们没有使用括号... - user529758
@JoshCaswell:好的,所以我正在更改它... 不过其他的都是正确的吗? - Anoop Vaidya
显示剩余2条评论

0

如果不考虑代码读者可能不知道这种类型,你可以使用每个选项。因此,为了符合惯例,请使用BOOL,它可以具有YES(1)或NO的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接