Kann Swift enums haben mehrere raw-Werte?
Ich zuordnen möchten zwei raw-Werte auf eine enum-Instanz (stellen Sie sich eine enum-Vertretung von Fehler-Typen, ich will Error.Teapot
haben einen Int-Typ-Eigenschaft code
mit Wert 418, und eine String-Eigenschaft festgelegt I'm a teapot
.)
Beachten Sie den Unterschied zwischen raw-Werte und die damit verbundenen Werte hier—ich möchte, dass alle Teapot
Instanzen haben eine code
418, will ich nicht einen eindeutigen zugeordneten Wert für jede Teapot
Instanz.
Gibt es einen besseren Weg, als das hinzufügen von berechneten Eigenschaften auf die enum, die switch
ed auf self
zu suchen, bis Sie den entsprechenden Wert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, ist ein enum nicht mehrere raw-Werte - es muss sich um einen einzelnen Wert, der Umsetzung der
Equatable
Protokoll, und wörtlich-Cabrio, wie beschrieben in der Dokumentation.Ich denke, die beste Vorgehensweise in deinem Fall ist die Verwendung der Fehler-code als roh-Wert und eine Eigenschaft, die, unterstützt durch eine vorkonfigurierte statische Wörterbuch mit dem Fehler-code als Schlüssel und den text als Wert.
Nein, Sie können mehrere raw-Werte, die mit einer enum.
In Ihrem Fall, Sie haben könnte, den raw-Wert gleich dem code, und den zugeordneten Wert mit der Beschreibung. Aber ich denke, dass die berechneten Eigenschaften Ansatzes ist die beste option hier.
Teapot
Instanzen sollten die gleiche Zeichenfolge; ich würde verwenden eine zugeordnete String-Wert, wenn ich wollte anfügen, sagen, ein Hinweis auf die Quelle von einem bestimmten Fehler-Instanz.Erstellte ich eine Art Simulation dieser (Nicht anders als das, was Marcos Crispino schlug auf seine Antwort). Weit von eine perfekte Lösung, sondern ermöglicht es uns, zu vermeiden, diese fiesen switch-Case-Anweisungen für jede andere Eigenschaft, die wir erhalten wollen.
Der trick ist, verwenden Sie eine Struktur, die als "Eigenschaften/Daten" holder und verwenden Sie es als eine RawValue im enum selbst.
Es hat ein bisschen von überschneidungen, aber es hilft mir bisher sehr gut. Jedes mal, wenn Sie wollen, fügen Sie ein neues enum-Fall, der compiler wird Sie daran erinnern, füllen Sie die zusätzlichen Fall in der rawValue-getter, das sollte Sie daran erinnern, zu aktualisieren
init?
was würde Sie daran erinnern, um die neue Eigenschaft static auf die struct.Gist
Code auf das Wesentliche:
Einer Problemumgehung, wenn Sie wollte haben viele statische Eigenschaften für eine YourError könnte zum importieren einer property-Liste; Sie können die root-Objekt in ein dictionary, mit Ihrem enum raw-Wert als Schlüssel für jedes Objekt, so dass Sie leicht abrufen statische strukturierten Daten für das Objekt.
Dies ist ein Beispiel für das importieren und mit einem plist: http://www.spritekitlessons.com/parsing-a-property-list-using-swift/
Möglicherweise zuviel für Sie einfach eine Beschreibung der Fehler, für die Sie nur verwenden Sie eine Feste statische Funktion mit einem switch-Anweisung für Ihre enum-Werte, gibt die fehlerzeichenfolge, die Sie benötigen. Legen Sie einfach die statische Funktion in der gleichen .swift-Datei als enum.
Beispielsweise
Dies hat den Vorteil (im Vergleich zu den .plist-Lösung) besser anzupassen (Lokalisierung). Jedoch, eine .plist konnte nur einen Schlüssel zum abrufen der richtigen Lokalisierung, statt einen Fehler-string, für diesen Zweck.
Haben Sie ein paar Optionen. Aber keiner von Ihnen beinhalten raw-Werte. Raw Werte sind einfach nicht das richtige Werkzeug für die Aufgabe.
Option 1 (so-so): die damit Verbundenen Werte
Ich persönlich empfehle dagegen, dass es mehr als einen zugeordneten Wert pro enum-Fall. Die damit verbundenen Werte sollten tot sein, offensichtlich (da Sie nicht über Argumente/- Namen), und Sie haben mehr als eine stark trübt das Wasser.
Das sagte, es ' s etwas die Sprache können Sie tun. Auf diese Weise haben Sie jeweils anders definiert wird, als auch, wenn das war es, was Sie brauchte. Beispiel:
Möglichkeit 2 (besser): Tupel! Und berechnete Eigenschaften!
Tupel sind ein großartiges feature von Swift, weil Sie Ihnen die macht der Erstellung von ad-hoc-Arten. Das bedeutet, Sie definieren Sie in-line. Süß!
Wenn die einzelnen Fehlertypen sind zu gehen, um einen code und eine Beschreibung, dann könnten Sie haben eine berechnete
info
Eigenschaft (hoffentlich mit einem besseren Namen?). Siehe unten:Aufruf dieser würde mich viel einfacher, da könnten Sie schmackhaft Punkt-syntax:
let errorCode = myErrorType.info.code
Diese nicht besonders die Antwort auf Ihre Frage, die Frage nach einem besseren Weg, als
switch
ing durchself
zu suchen, bis Sie den entsprechenden Wert, aber diese Antwort kann immer noch nützlich sein für jemanden, der sich in der Zukunft, dass muss ein einfacher Weg, um eine Zeichenfolge aus einer enum definiert ist, als ein integer-Typ.Diese Weise können wir die errorMessage zwei Möglichkeiten:
rawValue
definieren wir für die enum)Option 1:
Option 2:
In modernen Versionen von Swift ist es möglich, den string-Wert eines enum-case-Bezeichnung, auch ohne, dass enum erklärt wird, mit einer
: String
rawValue.So bekommen Sie den Namen der enumeration value in Swift?
Wenigstens dies ermöglicht haben "mehrere raw-Werte", indem er sowohl eine echte
: Int
rawValue als auch die Zeichenkette für den Fall label.Für den Anfang, vorausgesetzt, Sie möchten, speichern Sie einen code und eine message, die Sie verwenden können, um eine Struktur für
RawValue
Nächste Schritt ist die Definition der enum-als
RawRepresentable
, und verwenden SieErrorInfo
als raw-Wert:Was bleibt, ist die Zuordnung zwischen Instanzen von
MyError
undErrorInfo
:Mit den oben genannten, bauen wir die vollständige definition der enum:
Einige Hinweise:
Möglich umgehen kann assoziieren benutzerdefinierter Funktionen mit enum
Kann verwendet werden, als
Ausgabe
Möglicherweise können Sie zusätzliche Funktionen zuordnen enum-Typ für verschiedene Werte