1

只是想知道 - 鉴于我有一个带有有效元素“蓝色”的 typedef 枚举“颜色”(和同名的属性),为什么这样可以:

 BOOL isBlue;

 if (color == blue){
     isBlue = YES;
 }

但这不是:

BOOL isBlue;

isBlue = (color == blue);

我刚刚开始使用枚举,所以也许我错过了一些简单的东西?

编辑 - 如前所述,“蓝色”是枚举的有效元素之一,而不是 BOOL 本身,即:

typedef enum { Blue, Red, Yellow } color;

@property color color;

编辑 2 - 这是我的实际代码,根据要求。我对矛盾的评论/答案有点困惑。我应该期望它编译(它没有)吗?

。H

typedef enum { AddRecipes, ManageRecipes, RemoveRecipes } mode;

<snip>

@property mode mode;

.m

 @synthesize mode;

 <snip>

 BOOL modeIsAddRecipe = (mode == AddRecipes);

编辑 3 - 为了后代,我应该提到我的错误是微不足道且无关的。下面的讨论证明很有启发性,非常感谢。

4

3 回答 3

3

BOOL是一个简单的 typedef signed char(不要与bool类型混淆)

typedef signed char     BOOL; 
#define YES             (BOOL)1
#define NO              (BOOL)0

这意味着 BOOL 值可以是YESNO或其他任何值。例如,如果您尝试

BOOL testBool = 9;
NSLog(@"%d", testBool);

它将打印9. 不涉及编译器魔法或运行时魔法。在某些程序员编写一些愚蠢的布尔比较(例如if (testBool == YES),而不是if (testBool).

于 2012-04-22T02:50:30.253 回答
2

我猜这BOOL也是一个枚举。枚举的目的是枚举可以存储在该类型变量中的值。

因此,如果您的BOOL枚举具有值YESand NO,那么这些是唯一可以分配给 a 的值BOOL。您不能分配任何其他值,即使它们的计算结果与 和YES相同NO

==运算符返回1或(0truefalse,取决于语言)。但是编译器不允许您将任何这些值分配给 a BOOL,因为它们都不YESor NO

可以做的是使用三元运算符:

isBlue = (color == blue) ? YES : NO;

这会评估条件并返回YES它是真还是NO假。

于 2012-04-22T02:02:43.103 回答
1

正如@tia 已经告诉你的那样,BOOL定义为signed charYESNO分别定义为(BOOL)1(BOOL)0

正是由于这个原因,您在问题中显示的两个代码示例都可以正常工作。在后一个片段中,等式表达式的计算结果为 1 或 0。您可以自由地将这些整数值分配给BOOL( signed char) 值。

代码将成功编译和运行,既没有错误也没有不当行为。

如果您看到不同的内容,请编辑您的问题以包含您的实际代码及其产生的错误,因为您提供的代码可以正常工作。

编辑(现在您已经提供了实际代码):我认为它应该可以工作,但它目前不能(从 Xcode 4.3.1 开始)因为 Clang 将“<code>mode”解释为类型mode,而不是实例变量mode。如果您将类型重命名为RecipeMode或更改表达式以显式引用实例变量 ( self->mode) 或使用属性 ( self.mode),则编译正常。

所以,恭喜。您实际上(在我看来)发现了一个编译器错误!我建议报告它

于 2012-04-22T03:34:21.057 回答