J'utilise des énumérations pour stocker des valeurs de chaîne comme ceci:
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
}
}
}
Ensuite, j'y accède comme ceci:
print("Dogs be like:" + Animals.descDog.s)
Ma question est la suivante: puis-je étendre les énumérations comme n'importe quelle autre structure ou objet, je n'ai donc pas à ajouter le var s: String {}
propriété à chaque énumération?
Vous souhaitez ajouter une propriété à toutes les énumérations dont la valeur brute est une chaîne? Cela ressemble à un cas pour les extensions de protocole contraintes!
extension RawRepresentable where RawValue == String {
var description: String {
return rawValue
}
}
Cela fonctionne car toutes les énumérations avec une valeur brute se conforment automatiquement au protocole RawRepresentable
, et ledit protocole a un type associé RawValue
qui vous indique de quel type est la valeur brute.
Maintenant, votre Animals
enum en héritera automatiquement:
print(Animals.descCat.description) // -> "I has attitude"
Notez que les énumérations de chaînes sont elles-mêmes déjà CustomStringConvertible
, elles ont donc déjà une propriété description
(qui renvoie le nom du cas énuméré), et la vôtre ne la remplace pas:
print(Animals.descCat) // -> "descCat"
Si vous voulez que votre description
remplace la valeur par défaut, ajoutez simplement une déclaration de conformité CustomStringConvertible
à votre énumération:
private enum Animals: String, CustomStringConvertible { /*...*/ }
print(Animals.descCat) // -> "I has attitude"
Vous pouvez également étendre cette idée pour couvrir d'autres types de valeurs brutes. Par exemple:
extension RawRepresentable where RawValue: CustomStringConvertible {
var description: String {
return rawValue.description
}
}
Maintenant, vous pouvez obtenir des descriptions automatiques pour les énumérations dont la valeur brute est Int
ou même un type personnalisé (tant que ce type a son propre description
).