你想添加一個屬性到所有枚舉的原始值是一個字符串?這聽起來像是受限協議擴展的情況!
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
)自動描述。
'self.rawValue'在您的枚舉中已經是'String'類型。你爲什麼要投它? –
你是什麼意思「添加'var s:String {}'屬性到每個枚舉?」你的意思是「各種枚舉?」你不能用結構或對象來做到這一點。你的意思是別的嗎? –
也許我不需要在s {}屬性中輸入字符串。看起來像我在某個時候做過的,但現在似乎不能重現。 – MindSpiker