web-dev-qa-db-fra.com

Pouvez-vous étendre une énumération?

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?

33
MindSpiker

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).

73
rickster