2015-10-30 147 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