1

ただ疑問に思っています-有効な要素'blue'を持つtypedefenum'color'(および同じ名前のプロパティ)があるとすると、なぜこれで問題ないのですか?

 BOOL isBlue;

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

しかし、これはそうではありません:

BOOL isBlue;

isBlue = (color == blue);

列挙型を使い始めたばかりなので、簡単なものが足りないのではないでしょうか。

編集-前述のように、「青」は列挙型の有効な要素の1つであり、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であり、 ( typesigned 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列挙型に値YESとが含まれている場合NO、それらはに割り当てることができる唯一BOOLの値です。YESおよびと同じ数値に評価された場合でも、他の値を割り当てることはできませんNO

==演算子は1or 0(または、trueまたはfalse、言語によっては)を返します。ただし、コンパイラはこれらの値をに割り当てることを許可しません。これらの値はいずれもまたはではないBOOLためです。YESNO

できることは、三項演算子を使用することです。

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

YESこれは条件を評価し、それがtrueであるかfalseであるかを返しますNO

于 2012-04-22T02:02:43.103 に答える
1

@tiaがすでに言ったように、BOOLは、、signed charおよびとして定義され、それぞれYESおよびとして定義されます。NO(BOOL)1(BOOL)0

そのため、質問で示した両方のコードサンプルが問題なく機能します。後者のスニペットでは、等式は1または0のいずれかに評価されます。これらの整数値をBOOLsigned char)値に自由に割り当てることができます。

コードは正常にコンパイルおよび実行され、エラーや誤動作は発生しません。

何か違うものが表示された場合は、質問を編集して、実際のコードとそれが生成するエラーを含めてください。提供したコードは問題なく機能するためです。

編集(実際のコードを提供したので):動作するはずmodeですが、Clangは「<code> mode」をインスタンスではなくタイプとして解釈しているため、現在は動作しません(Xcode 4.3.1以降) 。変数mode。タイプの名前をに変更するRecipeModeか、式を変更してインスタンス変数()を明示的に参照するかself->mode、プロパティ(self.mode)を使用すると、正常にコンパイルされます。

だから、おめでとうございます。あなたは実際に(私の意見では)コンパイラのバグを見つけました!報告することをお勧めします。

于 2012-04-22T03:34:21.057 に答える