3

可能重复:
我应该为 iOS 布尔状态使用什么值?

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

  • _布尔
  • 布尔
  • 布尔值
  • boolean_t
  • 布尔值

它们至少有四对值:

  • 真假
  • 真假
  • 是的,没有
  • 1, 0

您认为哪一个最适合用于 iOS Objective C 开发?

更新 1

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

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

4

6 回答 6

5

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

bool
  • 由 C++ 定义。
  • 一个真正的布尔值,保证为 0 或 1。
_Bool
  • 由 C99 定义。
  • 一个真正的布尔值,保证为 0 或 1。
  • 如果包含 stdbool.h,则 bool 被 #定义为 _Bool。
BOOL
  • 由 Objective-C 运行时在/usr/include/objc/objc.h.
  • A signed char32 位。值可以是YES(0x01)、NO(0x00) 或 -127 到 128 范围内的任何值。 YES/NO定义在<Foundation/NSObjCRuntime.h>.
  • A bool64 位,保证为 0 或 1。
Boolean
  • 由CFBase.h中的 Carbon 定义。
  • 一个无符号字符。
  • 值可以是TRUE(0x01)、FALSE(0x00) 或 -127 到 128 范围内的任何值。
boolean_t
  • 被定义为/usr/include/mach/i386/boolean.h
  • x32 中的 int 或 x64 中的 unsigned int。

对于非真正的布尔类型:

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

很难想象一种或另一种产生影响的情况。在某些情况下,转换为 BOOL 可能会咬到你,还有一些罕见的情况(例如:KVO 将 BOOL 转换为 NSNumber,将 bool 转换为 CFBoolean)。如果有的话,当您始终使用 BOOL 时,您可以在 Apple 更改其定义的情况下得到保障。

于 2013-01-22T18:02:49.790 回答
3

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

于 2013-01-22T17:40:13.903 回答
2

它基本上是完全无动于衷的。在实践中,我敢打赌它们甚至以相同的方式声明:typedef signed char BOOL;, typedef signed char Boolean;, 等等。

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

[object someObjectiveCMethod:YES];

代替

[object someObjectiveCMethod:TRUE];

CFWhateverSetBooleanProperty(true);

代替

CFWhateverSetBooleanProperty(YES);
于 2013-01-22T17:40:47.793 回答
2

对 ObjC 代码使用 ObjC 的 BOOL。在他们“本地”的地方使用其他人。在阅读代码时,其他任何东西都会显得“不寻常”并且值得特别注意,这是一个应该为实际上不寻常且值得特别注意的代码保留的属性

于 2013-01-22T17:42:47.087 回答
0

带有 YES 和 NO 的 BOOL。

但是 BOOL 是有符号字符,所以 YES 等于 1,NO 等于 0。


objc.h它们被定义为:

typedef signed char BOOL; 

#define YES ((BOOL)1)
#define NO  ((BOOL)0)
于 2013-01-22T17:38:40.970 回答
0

如果不是因为阅读代码的人可能不知道这种类型,您可以使用每一个。因此,为了约定, use BOOLwhich 的值可能为YES(1) 或NO.

于 2013-01-22T17:41:09.690 回答