2017-02-28 107 views
6

考慮兩個斯威夫特枚舉:爲什麼@objc枚舉與純粹的Swift枚舉有不同的描述?

enum Foo: Int { 
    case bar 
} 

@objc enum Baz: Int { 
    case qux 
} 

如果我每個printcase這些枚舉的,我希望同樣的結果。相反,我看到一些意外:

print(Foo.bar) // "bar\n" 
print(Baz.qux) // "Baz\n" 

爲什麼印刷@objc枚舉的情況下打印枚舉名字,在打印純斯威夫特枚舉的case打印的實際case名字?添加@objc是否更改枚舉的調試描述?

+5

Swift枚舉攜帶比ObjC更多的元數據(case標籤)。 ObjC枚舉只是一系列的int,並沒有真正瞭解它們所代表的案例標籤。你可以通過打開枚舉來解決它,並返回不同的字符串:http://stackoverflow.com/a/14651888/3141234 – Alexander

+0

@Alexander非常感謝你!這終於對我產生了某種意義。我以爲我瘋了,因爲我見過的所有帖子都表明,在Swift中打印枚舉會顯示案例,儘管我清楚地看到了一個不是這種情況的例子(CBCentralManagerState)。謝謝! – vegather

回答

0

這是因爲@objc枚舉是「C兼容枚舉」,它故意不會發出關於它們的情況的任何反射信息。

由於雨燕是開源的,我們可以鼻子周圍看到這樣的自己:

這就是 「爲什麼」 的一個版本注重實施。現在,讓我們退一步,詢問,爲什麼這樣實現?對C兼容枚舉的emitCaseNames函數的註釋解釋了這一點:C兼容枚舉不保證從枚舉原始值映射回標籤,因爲與Swift本地枚舉不同,它們可以有多個個案所有這些都具有相同的原始價值。

現在,如果您嘗試在Swift中聲明一個重複原始值的枚舉值,那麼您將得到您的手掌和編譯器錯誤。但是你應該能夠通過在Obj/C中聲明枚舉然後通過橋將它導入Swift來創建這樣的枚舉。