你想添加一个属性到所有枚举的原始值是一个字符串?这听起来像是受限协议扩展的情况!
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