Die Sprachreferenz, wenn Sie über Aufzählungserklärung , stellt klar, dass:
Der Rohwerttyp muss dem Equatable-Protokoll und einem der folgenden literalkonvertierbaren Protokolle entsprechen: IntegerLiteralConvertible für Ganzzahlliterale, FloatingPointLiteralConvertible für Gleitkommaliterale, StringLiteralConvertible für Zeichenfolgenliterale, die eine beliebige Anzahl von Zeichen enthalten, und ExtendedGraphhemeClusterLiteralConvertible für Zeichenfolgenliterale, die nur ein einzelnes Zeichen enthalten.
Es kann also nichts anderes als Literale als Rohwerte verwendet werden.
Eine mögliche Problemumgehung besteht darin, das Wörterbuch als Zeichenfolge darzustellen. Sie können z. B. Elemente durch Kommas trennen und einen Wert mit Doppelpunkt eingeben:
%Vor%Erstellen Sie dann mithilfe einer berechneten Eigenschaft (oder einer Methode, falls Sie dies bevorzugen) das Wörterbuch:
%Vor%@Antonio gibt Abhilfe, beantwortet jedoch nicht die eigentliche Frage.
Definieren Sie Ihre Enum.
%Vor% Geben Sie nicht-literale Werte für Fälle an, die mit dem Protokoll " RawRepresentable
" übereinstimmen. Tun Sie es durch Enum-Erweiterung, um sauberer Code zu haben.
Um Tuple
in switch zu finden, implementieren Sie den Mustervergleichsoperator.
Und das ist es ...
%Vor% Sagen wir, ich habe die Frage ohne Frage beantwortet. Jetzt ... Enums (zumindest in Swift) sind so konzipiert, dass sie einzigartige Fälle haben. Nachteil dieser Problemumgehung ist, dass Sie (hoffentlich durch Zufall) dieselbe rawValue
für mehr Fälle halten können. Generell riecht dein Beispielcode nach mir. Wenn Sie (aus sehr vernünftigen Gründen) keinen neuen Enum-Wert aus Tupel erstellen müssen, sollten Sie ein Redesign in Betracht ziehen. Wenn Sie diese Problemumgehung verwenden möchten, empfehle ich (abhängig vom Projekt) eine Überprüfung durchzuführen, wenn alle case-Rohwerte eindeutig sind. Wenn nicht, bedenke dies: