只是想知道 - 假设我有一个有效元素'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 - 对于后代我应该提到我的错误是微不足道和无关的。下面的讨论证明了很有启发性,非常感谢。
答案 0 :(得分:3)
BOOL
是一个简单的typedef,signed char
(不要与bool
类型混淆)
typedef signed char BOOL;
#define YES (BOOL)1
#define NO (BOOL)0
这意味着BOOL值可以是YES
,NO
或其他任何内容。例如,如果您尝试
BOOL testBool = 9;
NSLog(@"%d", testBool);
它将打印9
。没有涉及编译器魔术或运行时魔法。在一些程序员编写一些像if (testBool == YES)
而不是if (testBool)
这样的愚蠢布尔比较之前,这根本不会有任何问题。
答案 1 :(得分:2)
我猜测BOOL
也是一个枚举。枚举的目的是枚举可以存储在该类型变量中的值。
因此,如果您的BOOL
枚举的值为YES
和NO
,那么这些仅值可分配给{{1} }。您无法指定任何其他值,即使它们评估为与BOOL
和YES
相同的数值。
NO
运算符返回==
或1
(或0
或true
,具体取决于语言)。但编译器不允许您将这些值的分配给false
,因为它们的 none 是BOOL
或{{1 }}
可以做的是使用三元运算符:
YES
这会评估条件并返回NO
如果是真,或isBlue = (color == blue) ? YES : NO;
如果它是假的。
答案 2 :(得分:1)
正如@tia已经告诉你的那样,BOOL
被定义为signed char
,而YES
和NO
被定义为(BOOL)1
和(BOOL)0
分别。
出于这个原因,您在问题中显示的两个代码示例都可以正常工作。在后一个片段中,等式表达式的计算结果为1或0.您可以自由地将这些整数值分配给BOOL
(signed char
)值。
代码将成功编译并运行,既没有错误也没有错误行为。
如果您看到不同的内容,请修改您的问题以包含您的实际代码及其产生的错误,因为您提供的代码运行正常。
编辑(现在你已经提供了实际的代码):我认为应该工作,但它目前没有(从Xcode 4.3.1开始),因为Clang正在解释“{{ 1}}“作为类型mode
,而不是实例变量mode
。如果将类型重命名为mode
或将表达式更改为显式引用实例变量(RecipeMode
)或使用属性(self->mode
),则编译正常。
所以,恭喜你。你实际上(在我看来)发现了编译器错误!我建议reporting it。