3

これらの列挙型で...

typedef enum {
    ThisThingA = 0,
    ThisThingB = 1
} ThisThing;

typedef enum {
    ThatThingX = 8,
    ThatThingY = 9
} ThatThing;

そしてこれらのプロパティ...

@property (nonatomic) ThisThing thisThing;
@property (nonatomic) ThatThing thatThing;

私がすることができます...

self.thisThing = thatThingX;

コンパイラから警告が表示されません。これは予想通りです。コンパイラからの警告がないのはなぜですか? ThatThing 型のものを ThisThing 型のものに割り当てることができるのはなぜですか?

Martin Rからの回答に従って編集:しかし、私がこれを行うと...

[self setThisThing:thatThingX];

警告が表示されます: 列挙型 'ThatThing' から別の列挙型 'ThisThing' への暗黙の変換

(Xcode 4.6.3 および iOS 6.0)

4

3 に答える 3

1

コンパイラ オプション "Implicit Enum Conversions (-Wenum-conversion)" はデフォルトでオンになっており、異なる列挙型の変数に割り当てると、実際には警告が表示されます。

ThisThing x = ThatThingX;

または、setter メソッドを使用してプロパティを設定する場合:

[self setThisThing:ThatThingX];

どちらの場合も、警告が表示されます

列挙型 'ThatThing' から別の列挙型 'ThisThing' への暗黙的な変換 [-Wenum-conversion]

「ドット」構文を使用して値を設定する場合のみ

self.thisThing = ThatThingX;

その場合、警告は表示されないため、これはコンパイラのバグである可能性があります。

于 2013-06-28T07:11:05.757 に答える
0

enum は整数型の C コンストラクトです。型チェック済みです。あなたの使用法は同じデフォルトの整数型であるため、コンパイラの目には何も問題はありません。あなたの使い方はintです。

int を Bob として型定義し、再び Josephine として型定義すると、コードがわかりやすくなります。Bob と Josephine は、同じ int 型のままです。

2 つの列挙型を宣言し、一方が NSUInteger を使用し、もう一方が NSInteger を使用する場合、暗黙的な変換の設定によっては警告が表示される可能性があります。

これは本当にCの質問です。

于 2013-06-28T07:05:00.507 に答える
-1

実際には enum オプションは NSInteger として扱われます。そのため、デフォルトで ThingXの値は 0 になります。self.thisThing = thatThingX; self.thisThingを割り当てると、値が 0 になったので、ThisThingAになります。そのため、警告はありません。

于 2013-06-28T06:56:13.953 に答える