枚举的布尔比较

时间:2012-04-22 01:55:59

标签: iphone objective-c enums boolean typedef

只是想知道 - 假设我有一个有效元素'blue'的typedef枚举'color'(和同名属性),为什么这样可以:

 BOOL isBlue;

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

但这不是:

BOOL isBlue;

isBlue = (color == blue);

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

编辑 - 如上所述'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 - 对于后代我应该提到我的错误是微不足道和无关的。下面的讨论证明了很有启发性,非常感谢。

3 个答案:

答案 0 :(得分: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)这样的愚蠢布尔比较之前,这根本不会有任何问题。

答案 1 :(得分:2)

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

因此,如果您的BOOL枚举的值为YESNO,那么这些值可分配给{{1} }。您无法指定任何其他值,即使它们评估为与BOOLYES相同的数值。

NO运算符返回==1(或0true,具体取决于语言)。但编译器不允许您将这些值的分配给false,因为它们的 none BOOL或{{1 }}

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

YES

这会评估条件并返回NO如果是真,或isBlue = (color == blue) ? YES : NO; 如果它是假的。

答案 2 :(得分:1)

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

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

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

如果您看到不同的内容,请修改您的问题以包含您的实际代码及其产生的错误,因为您提供的代码运行正常。

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

所以,恭喜你。你实际上(在我看来)发现了编译器错误!我建议reporting it