我使用过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,
};
有什么原因吗?感谢。
答案 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,
};