2016-03-02 111 views
1

'emun'在我看來就像一個關鍵字或基本類型。 很顯然下面的代碼無法編譯:如何檢查一個實例是否爲枚舉類型

if self is enum { 

} 

但我怎麼能能夠檢查如果某些協議由任何enum實施?

protocol Enumatable { 

} 

extension Enumatable { 
    func isEnum() -> Bool { 
     return self is enum //it does not compile 
    } 
} 

但我真正想要的是在協議中設置某種約束來強制採用類爲枚舉。那可能嗎?

謝謝!

+3

我不認爲這是可能的。但真正的問題是爲什麼? –

+0

那麼,因爲使用枚舉的case結構,我可以爲我的庫提供一個簡單而安全的api。我不希望用戶能夠使用類或結構來實現協議,因爲我的庫使用枚舉的值作爲內部鍵,另外我希望這種模式是實現協議的唯一方式。 –

+1

您可能與'ErrorType'類似的情況。錯誤類型最好用作枚舉類型,但這並不意味着我們必須將其限制爲枚舉類型。你不可能阻止你的用戶在腳下自己射擊。一個好的文檔是最好的,你可以做的。 –

回答

0

我不確定它是如何使用鏡像的高性能。但在這裏你去:

enum SomeEnum { 
     case one 
     case two 
    } 

    let mirror = Mirror(reflecting: SomeEnum.one) 
    if let displayStyle = mirror.displayStyle { 
     switch displayStyle { 
     case .enum: 
      print("I am an enum") 
     default: 
      print("not an enum") 
     } 
    } 
相關問題