Sie möchten allen Enums eine Eigenschaft hinzufügen, deren Rohwert eine Zeichenkette ist? Das klingt wie ein Fall für eingeschränkte Protokollerweiterungen!
extension RawRepresentable where RawValue == String {
var description: String {
return rawValue
}
}
Dies funktioniert, weil alle Aufzählungen mit einem rohen Wert automatisch auf den RawRepresentable
Protokoll entsprechen, und das Protokoll einen zugehörigen Typ hat RawValue
, der Ihnen sagt, welche Art der Rohwert ist.
Jetzt ist Ihre Animals
Enum wird es automatisch erben:
print(Animals.descCat.description) // -> "I has attitude"
Hinweis, dass String-Aufzählungen selbst sind bereits CustomStringConvertible
, so dass sie bereits eine description
Eigenschaft (die den Namen des ENUM-Fall zurückgibt), und Ihr doesn ‚t es außer Kraft setzen:
print(Animals.descCat) // -> "descCat"
Wenn Sie Ihre description
mögen die Standards außer Kraft zu setzen, fügen Sie einfach eine Erklärung von CustomStringConvertible
Konformität mit Ihrem enum:
private enum Animals: String, CustomStringConvertible { /*...*/ }
print(Animals.descCat) // -> "I has attitude"
können Sie auch diese Idee erweitern andere Rohwert Typen abzudecken. Zum Beispiel:
extension RawRepresentable where RawValue: CustomStringConvertible {
var description: String {
return rawValue.description
}
}
Jetzt können Sie die automatischen Beschreibungen für Aufzählungen, dessen Rohwert Int
oder sogar ein benutzerdefinierter Typ (solange diese Art ein description
seiner eigenen hat) erhalten.
'self.rawValue' ist bereits vom Typ' String' in Ihrer Enumeration. Warum schenkst du es? –
Was meinen Sie mit "fügen Sie die Eigenschaft' var s: String {} 'zu jeder Enumeration hinzu?" Meinst du "jede Art von Enum?" Das können Sie nicht mit Strukturen oder Objekten tun. Meinst du etwas anderes? –
Vielleicht brauche ich nicht die as String in der Eigenschaft s {}. Scheint so, als ob ich es irgendwann getan hätte, aber scheint nicht in der Lage zu sein, jetzt neu zu erschaffen. – MindSpiker