使用NSInteger进行有符号整数时不会抛出编译错误

时间:2014-04-08 10:56:33

标签: objective-c ios7

我使用过NSUInteger并将值定义为-1。这应该通过编译错误对吗?但事实并非如此。

typedef NS_ENUM(NSUInteger, IRPartAlertType) {
    IRAlertNone,
    IRNoParts,
    IRAllDOAParts,
    IRMoreThanFiveParts,
    IRReviewParts,
    IRSamePartOrderedMoreThanOnce = -1
};

但是下面的代码在第3个值中抛出错误,说使用NSInteger而不是NSUInteger

typedef NS_ENUM(NSUInteger, IRPartAlertType) {
    IRAlertNone = 0,
    IRNoParts = -1,
    IRAllDOAParts,
    IRMoreThanFiveParts,
    IRReviewParts,
    IRSamePartOrderedMoreThanOnce = -1,
};

有什么原因吗?感谢。

1 个答案:

答案 0 :(得分:0)

-1实际上是一个有效的NSUInteger,它将在编译时解释为4294967295(无符号值-1,又名NSUIntegerMax

什么不是有效的NSUInteger 4294967296,在您失败的情况下,IRAllDOAParts的值为IRNoParts+1,这是枚举中的值的方式由编译器设置。 如果未设置显式值,则设置前一个+ 1。

typedef NS_ENUM(NSUInteger, IRPartAlertType) {
    IRAlertNone = 0,
    IRNoParts = -1,    //    > 4294967295
    IRAllDOAParts,     // +1 > 4294967296 > Error
    IRMoreThanFiveParts,
    IRReviewParts,
    IRSamePartOrderedMoreThanOnce = -1, // No +1, no error
};

如果您在Xcode中看得很清楚,您会看到错误图标位于= -1以下的行上,这解释了当-1是最后一个值时不会发生的原因。

例如,那将编译:

typedef NS_ENUM(NSUInteger, IRPartAlertType) {
    IRAlertNone = 0,
    IRNoParts = -1,
    IRAllDOAParts = 1, // valid value
    IRMoreThanFiveParts,
    IRReviewParts,
    IRSamePartOrderedMoreThanOnce = -1,
};