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。

如果您将def int 键入为 Bob 并再次键入 Josephine,则可以方便代码清晰。Bob 和 Josephine 仍然是相同的 int 类型。

如果您声明两个枚举但一个使用 NSUInteger 而另一个使用 NSInteger 您可能会收到警告,具体取决于您的隐式转换设置。

这真的是一道C题。

于 2013-06-28T07:05:00.507 回答
-1

实际上枚举选项被视为 NSInteger。所以默认情况下, ThingX的值为 0。当您分配self.thisThing = thatThingX; self.thisThing时,其值为 0。因此它将变为ThisThingA。这就是没有警告的原因。

于 2013-06-28T06:56:13.953 回答