2015-10-30 17 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列挙型は、それを自動的に継承します:彼らはすでに(列挙型ケースの名前を返します)description性質を持っている、とあなたはdoesnのように文字列の列挙型は、すでにCustomStringConvertible自身であることを

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

お知らせ「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

良い点。拡張をさらに拡張するために私の答えを編集しました。 (Yo dawg ...) – rickster