在 Objective-C 中,使用 true 和 false 作为布尔值常量并不是推荐的做法,虽然它们在语法上是合法的。Objective-C 是基于 C 语言的,而 C 语言本身并没有布尔类型,直到 C99 才引入了 _Bool 类型。Objective-C 继承了 C 语言的特性,因此通常使用 YES 和 NO 来表示布尔值,而不是 true 和 false。下面是对这一问题的深入分析。

1. Objective-C 使用 YES 和 NO 的历史背景

在早期的 Objective-C 版本中,C 语言并没有内建的布尔类型(bool),因此 Foundation Framework 定义了两个常量:YES 和 NO,它们是 NSInteger 类型的常量,用来表示布尔值:

  • YES 被定义为 1(即 NSInteger 类型的 1)。
  • NO 被定义为 0(即 NSInteger 类型的 0)。

这些常量使得 Objective-C 代码更加一致,特别是与 Cocoa 框架和其他 Apple API 一致。

2. 为什么不推荐使用 true 和 false

1. 与 Objective-C 的习惯不一致

在 Objective-C 中,使用 YES 和 NO 是一种约定,它们符合 Cocoa 和 Cocoa Touch 框架的惯例。因此,虽然 true和 false 在 C 语言和现代 C++ 中被广泛使用,但它们不符合 Objective-C 的代码风格,也与 Apple 的 API 标准不一致。

// 推荐方式:使用 YES 和 NO
if (isUserLoggedIn == YES) {
    NSLog(@"User is logged in");
} else {
    NSLog(@"User is not logged in");
}

与之相比,使用 true 和 false

// 不推荐方式:使用 true 和 false
if (isUserLoggedIn == true) {
    NSLog(@"User is logged in");
} else {
    NSLog(@"User is not logged in");
}

这种不一致会影响代码的可读性和统一性,尤其是在团队合作时,可能会让其他开发者产生混淆。

2. 语义上不清晰

true 和 false 在 C 和 C++ 中是 bool 类型的关键字,而在 Objective-C 中,YES 和 NO 代表的是 NSInteger 类型的常量。在 Objective-C 中,布尔值通常表示 “是” 或 “否”(YES/NO),而 true 和 false 则更常见于布尔类型的值。

使用 YES 和 NO 可以更清晰地表达 “是” 或 “否” 的语义,符合自然语言习惯,而使用 true 和 false 则可能会让代码显得不太符合 Cocoa 框架的设计哲学。

3. Cocoa 框架中大量使用 YES 和 NO

Apple 提供的许多 API 都使用 YES 和 NO,例如 BOOL 类型的返回值:

  • - (BOOL)isHidden:判断视图是否隐藏。
  • - (BOOL)isEqualToString:(NSString *)string:判断两个字符串是否相等。

在这些 API 中,返回的值就是 YES 或 NO,如果你在这些方法的条件判断中使用 true 和 false,会使得代码显得不一致并可能导致误解。

3. true 和 false 的实现

在 Objective-C 中,true 和 false 是由标准 C 语言的预定义宏所定义的,分别为 1 和 0

#define true 1
#define false 0

因此,从语法角度来看,使用 true 和 false 并不会导致错误,但它们的使用并不符合 Objective-C 的惯例和标准,容易导致代码风格不一致。

4. 可能导致混淆

在某些情况下,true 和 false 的使用可能会与其他库或框架中的常量混淆。例如,Cocoa 的 BOOL 类型是一个 32 位的整数,它只有两个有效值:YES 和 NO,但是如果混用 true 和 false,可能会导致误用或不一致的情况。

5. 示例:为什么 YES 和 NO 更合适

示例 1:Objective-C 中的条件语句

BOOL isUserLoggedIn = YES;

if (isUserLoggedIn == YES) {
    NSLog(@"User is logged in");
} else {
    NSLog(@"User is not logged in");
}

在这个示例中,YES 和 NO 提供了明确且一致的语义。

示例 2:Cocoa Framework 中的返回值

许多 Cocoa API 会返回 BOOL 类型的值,表示是否满足某种条件:

- (BOOL)isVisible {
    return self.hidden == NO;
}

这段代码使用了 NO 来表示视图是否可见,符合 Objective-C 的常规习惯。

6. 总结

虽然在 Objective-C 中可以使用 true 和 false,但是不推荐这样做,原因包括:

  • 代码一致性YES 和 NO 是 Cocoa 和 Cocoa Touch API 中广泛使用的标准,它们更加符合 Objective-C 的习惯。
  • 语义清晰YES 和 NO 更符合 “是/否” 的自然语言语义,而 true 和 false 更适合 C 和 C++ 中的 bool 类型。
  • 可维护性:统一使用 YES 和 NO 可以提高代码的可读性和可维护性。

因此,尽量避免使用 true 和 false,而使用 Objective-C 推荐的 YES 和 NO,这样能够使你的代码更符合规范,并更易于与其他开发者协作。