2015-10-30 23 views
28

Ich benutze Aufzählungen String-Werte wie folgt zu speichern:Können Sie eine Enum erweitern?

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 
      } 
     } 
    } 

Dann habe ich sie wie folgt zugreifen:

print("Dogs be like:" + Animals.descDog.s) 

Meine Frage ist kann ich Aufzählungen wie jede andere Struktur erweitern oder das Objekt ich so don‘ Ich muss die var s: String {} Eigenschaft zu jeder Enum hinzufügen?

+0

'self.rawValue' ist bereits vom Typ' String' in Ihrer Enumeration. Warum schenkst du es? –

+1

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? –

+0

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

Antwort

60

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.

+0

besser als meine Antwort, bekam meine Stimme Herr! Daran habe ich nicht gedacht. Aber selbst wenn der rawValue kein 'String' ist, können Sie trotzdem viele Typen in' String' umwandeln. –

+0

Jetzt ist es perfekt! –

+1

Guter Punkt. Ich habe meine Antwort bearbeitet, um die Erweiterungen weiter zu erweitern. (Yo dawg ...) – rickster

Verwandte Themen