Pouvez-vous étendre un enum?
Je utiliser les énumérations pour stocker les 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
}
}
}
Puis-je y accéder comme ceci:
print("Dogs be like:" + Animals.descDog.s)
Ma question est puis-je prolonger les énumérations, comme toute autre structure ou d'un objet donc je n'ai pas pour ajouter l' var s: String {}
propriété à chaque enum?
self.rawValue
est déjà de typeString
dans votre enum. Pourquoi êtes-vous un moulage?- Qu'entendez-vous par "ajouter le
var s: String{}
propriété à chaque enum?" Voulez-vous dire "tous les sorte de enum?" Vous ne pouvez pas le faire avec des structures ou des objets. Voulez-vous dire quelque chose d'autre? - Peut-être que je n'ai pas besoin comme une Chaîne de caractères exprimés dans la s{} la propriété. Semble comme je l'ai fait à un certain point, mais ne semblent pas être en mesure de recréer maintenant.
- - Je ajouter de la s {} la propriété régulièrement pour les énumérations, car il est plus court et plus propre que rawValue. Je n'ai pas besoin de l'ajouter à chaque type d'enum seulement ceux de type Chaîne de caractères.
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez ajouter une propriété à tous les énumérations dont la valeur est une chaîne de caractères? Cela sonne comme un cas de contrainte dans les extensions de protocole!
Cela fonctionne parce que tous les énumérations avec une valeur brute automatiquement conformes à la
RawRepresentable
protocole, et ledit protocole est associé à un type deRawValue
qui vous indique le type de la valeur brute est.Maintenant votre
Animals
enum héritera automatiquement il:Avis que la chaîne des enums sont eux-mêmes déjà
CustomStringConvertible
, de sorte qu'ils ont déjà undescription
propriété (qui renvoie le nom de l'énumération des cas), et le vôtre n'est pas le remplacer:Si vous voulez que votre
description
pour remplacer la valeur par défaut, il suffit d'ajouter une déclaration deCustomStringConvertible
conformité à vos enum:Vous pouvez également étendre cette idée à couvrir d'autres valeur brute types. Par exemple:
Maintenant, vous pouvez obtenir automatique de descriptions pour les énumérations dont la valeur brute est
Int
ou même un type personnalisé (tant que le type a undescription
de sa propre).String
vous pouvez toujours convertir un grand nombre de types deString
description
est automatique "de l'utiliser comme une chaîne contextuellement" cas, commeprint
, chaîne d'interpolation, et le débogueur/aire de jeux. (Aussi, j'ai commencé à écrire ma réponse surdescription
parce que votre question était que, avant que vous l'avez édité. 🙂 Si vous souhaitez étendreRawRepresentable
pour ajouter une nouvelle propriété, vous pouvez toujours utiliser le type de contraintes et/ou de l'appel par le biais derawValue.description
pour que.String
ne pas se conformer àCustomStringConvertible
, donc vous devez utiliser la solution originale pourString
enums et l'autre pour l'autre-chaîne-représentable, les énumérations.