2015-10-30 144 views
28

我用枚舉來存儲這樣的字符串值:你可以擴展一個枚舉嗎?

enum Animals: String { 
     case descCat = "I has attitude" 
     case descDog = "how can I help" 
     case descGator = "I will eat you" 
     var s: String { 
      get { 
       return self.rawValue as String 
      } 
     } 
    } 

然後我訪問他們像這樣:

print("Dogs be like:" + Animals.descDog.s) 

我的問題是我能延長枚舉像任何其他結構或對象,以便我不不得不將var s: String {}屬性添加到每個枚舉?

+0

'self.rawValue'在您的枚舉中已經是'String'類型。你爲什麼要投它? –

+1

你是什麼意思「添加'var s:String {}'屬性到每個枚舉?」你的意思是「各種枚舉?」你不能用結構或對象來做到這一點。你的意思是別的嗎? –

+0

也許我不需要在s {}屬性中輸入字符串。看起來像我在某個時候做過的,但現在似乎不能重現。 – MindSpiker

回答

60

你想添加一個屬性到所有枚舉的原始值是一個字符串?這聽起來像是受限協議擴展的情況!

extension RawRepresentable where RawValue == String { 
    var description: String { 
     return rawValue 
    } 
} 

這工作,因爲與原始值的所有枚舉自動符合RawRepresentable協議,並表示協議都有相應的類型RawValue,告訴您哪種類型的原始值。現在

Animals枚舉將自動繼承它:

print(Animals.descCat.description) // -> "I has attitude" 

注意,串枚舉本身已經CustomStringConvertible,所以他們已經有了description屬性(即返回枚舉案件的名稱),你沒有按「T重寫它:

print(Animals.descCat) // -> "descCat" 

如果你希望你的description覆蓋默認情況下,只需添加CustomStringConvertible一致性的聲明,您的枚舉:

private enum Animals: String, CustomStringConvertible { /*...*/ } 
print(Animals.descCat) // -> "I has attitude" 

您還可以擴展這個想法到其他原始值的類型。例如:現在

extension RawRepresentable where RawValue: CustomStringConvertible { 
    var description: String { 
     return rawValue.description 
    } 
} 

,你可以得到枚舉,其原始值Int甚至是自定義類型(只要該類型都有自己的description)自動描述。

+0

比我的回答更好,得到我的投票先生!沒有想到這一點。然而,即使rawValue不是'String',你仍然可以將很多類型轉換爲'String' –

+0

現在完美了! –

+1

好點。我編輯了我的答案以進一步擴展擴展。 (喲dawg ...) – rickster