我在iOS项目中有一个代码的switch / case部分,用于检查NSCalendarUnit类型的变量。首先,Xcode 5.0.2发出警告,不包括switch语句中的一些枚举值。所以我添加了其余的,除了NSCalendarUnitNanosecond,Xcode表示在iOS中不可用,甚至在显示自动完成选择时通过它添加红色删除线。然而,Xcode 5.0.2仍在给我警告
在交换机
中未处理枚举值'NSCalendarUnitNanosecond'
它对iOS有效吗?
(它是Mac OS X的一部分,例如https://developer.apple.com/library/mac/releasenotes/General/APIDiffsMacOSX10_9/Foundation.htm
作为旁注,有趣的是https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/NSCalendar_Class/History/History.html#//apple_ref/doc/uid/TP40003626-RH1-SW1的Apple文档已过时,最近一次更新是在2011年。
答案 0 :(得分:3)
预处理源文件时,可以看到NSCalendarUnit
的定义
在iOS上扩展到
enum NSCalendarUnit : NSUInteger {
// ...
NSCalendarUnitNanosecond __attribute__((availability(ios,unavailable))) = (1 << 15),
// ...
}
表示iOS上的NSCalendarUnitNanosecond
不可用。
但似乎编译器没有正确地遵守可用性属性
检查switch
语句时。
使用以下示例可以轻松复制:
enum MyEnum {
Enum1,
Enum2,
Enum3 UNAVAILABLE_ATTRIBUTE
};
enum MyEnum e = 0;
switch (e) {
case Enum1:
case Enum2:
break;
default:
break;
}
还会产生&#34;枚举值,而不是在交换机&#34;编译时发出警告
-Weverything
。这似乎是一个编译器错误。
当然,您可以使用
在本地取消警告#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wswitch-enum"
// switch-statement
#pragma clang diagnostic pop