2013-12-21 19 views
1

我在iOS項目中有一個開關/大小寫代碼段,用於檢查NSCalendarUnit類型的變量。起初,Xcode 5.0.2給出了關於在switch語句中不包括某些枚舉值的警告。所以我添加了其餘的部分,NSCalendarUnitNanosecond除外,其中Xcode指示在iOS中不可用,甚至在顯示自動完成選擇時會穿過紅色刪除線。然而,Xcode的5.0.2仍然是給我的警告NSCalendarUnit:是NSCalendarUnitNanosecond NSCalendarUnit的有效枚舉值或不是?

枚舉值「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蘋果文檔是過時的,而最後在2011年

回答

3

更新當預處理源文件,人們可以看到,NSCalendarUnit 定義iOS上膨脹到

enum NSCalendarUnit : NSUInteger { 
// ... 
NSCalendarUnitNanosecond __attribute__((availability(ios,unavailable))) = (1 << 15), 
// ... 
} 

這意味着NSCalendarUnitNanosecond在iOS上不可用

但是,在檢查switch語句時,似乎編譯器沒有正確地遵守可用性屬性 。

這可以很容易地用下面的例子再現:

enum MyEnum { 
    Enum1, 
    Enum2, 
    Enum3 UNAVAILABLE_ATTRIBUTE 
}; 

enum MyEnum e = 0; 
switch (e) { 
    case Enum1: 
    case Enum2: 
     break; 
    default: 
     break; 
} 

還產生與 -Weverything編譯時警告了「開關沒有處理枚舉值」。這似乎是一個編譯器錯誤。

當然你也可以用

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wswitch-enum" 

// switch-statement 

#pragma clang diagnostic pop 
+0

由於局部抑制警告,我認爲這可能是一個編譯器缺陷,它很高興見到你確認它,再加上還建議如何抑制警告。 – auspicious99