生の値が文字列であるすべての列挙型にプロパティを追加したいですか?これは、拘束されたプロトコル拡張の場合のように思えます!
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
を持っているとして)列挙型の自動記述を得ることができます。
'self.rawValue'はすでに列挙型の' String'型です。なぜあなたはそれをキャストしていますか? –
"それぞれの列挙型に' var s:String {} 'プロパティを追加することはどういう意味ですか?" 「あらゆる種類の列挙型」を意味しますか?あなたは構造体やオブジェクトでそれを行うことはできません。他に何か意味がありますか? –
おそらく、私はs {}プロパティで文字列をキャストする必要はありません。ある時点でやったように見えますが、今再現できないようです。 – MindSpiker