2014-10-18 6 views
12

erkennt ich bin mit Xcode 6 Spielplatz Aufzählungen in Swift auszuprobieren:Enum der rawValue Eigenschaft nicht

enum Rank: String 
{ 
    case One = "One", Two="Two" 

    init(rawValue : String) 
    { 
     self.rawValue = rawValue 
    } 
} 

Ich mag init außer Kraft zu setzen, so dass der Enum mit initialisiert werden kann rawValue als Argument ist. Aber ich erhalte eine Fehlermeldung:

enter image description here

Aber nach dem Apple's Swift guide meinem Code soll korrekt sein.

Antwort

10

Martin Antwort Die fromRaw() und toRaw() Verfahren wurden von a (failable) initializer und eine rawValue Eigenschaft ersetzt ist völlig richtig.

Hier ist eine andere Ansicht, die Ihre Frage direkter beantwortet.

In Xcode 6.0 hat eine enum keine rawValue Eigenschaft. rawValue wurde in Xcode 6.1 hinzugefügt, aber beachten Sie, dass es sich um eine schreibgeschützte berechnete Eigenschaft handelt, so dass Sie sie auch nicht in Xcode 6.1 zuweisen können.

In Xcode 6.1 ist es nicht notwendig, einen Initialisierer zu implementieren, der eine rawValue übernimmt, weil diese bereits von der Sprache nativ bereitgestellt wurde. Wenn Sie dieses Verhalten in Xcode 6.0 zu imitieren versuchen, dann könnten Sie versuchen, so etwas wie:

enum Rank: String 
{ 
    case One = "One", Two="Two" 

    init(rawValue : String) 
    { 
     self = Rank.fromRaw(rawValue) 
    } 
} 

aber das Problem dabei ist, dass fromRaw gibt einen optionalen ENUM-Wert, da die rawValue Zeichenkette an einem Enum-Wert entsprechen könnte.

Was machen Sie an dieser Stelle? Sie könnten einen ! hinzufügen, um den Wert zu zwingen auszupacken:

self = Rank.fromRaw(rawValue)! 

aber dies würde abstürzen, wenn Sie eine Enumeration mit einem ungültigen Rohwert zu schaffen versucht.

Sie eine der ENUM-Werte als und eine Standard-Behandlung könnte die nil koaleszierende Operator?? verwenden, um es sicher auspacken:

self = Rank.fromRaw(rawValue) ?? One 

, die einen Absturz vermeiden würde, aber wahrscheinlich zu unerwarteten führen würde Verhalten seitens Ihres Programms.

Was Sie in Xcode 6.0 nicht tun können, ist die init Rückgabe eines optionalen Wertes. Diese Funktion wurde in Xcode 6 hinzugefügt.1 und es war genau diese neue Fähigkeit, die es ihnen ermöglichte, fromRaw() von einer Funktion in Xcode 6.0 zu einem optionalen Initializer in Xcode 6.1 zu ändern.

14

Die Konvertierungsmethoden zwischen Enums und ihren Rohwerten wurden zwischen Xcode 6.0 und Xcode 6.1 geändert.

Xcode 6.0:

// raw value to enum: 
if let rank = Rank.fromRaw("One") { } 

// enum to raw value: 
let str = rank.toRaw() 

Xcode 6.1:

// raw value to enum: 
if let rank = Rank(rawValue: "One") { } 

// enum to raw value: 
let str = rank.rawValue 
+0

Wissen Sie, ob normale/nicht failable Initialisierer nicht unterstützt werden oder nur kaputt sind? http://stackoverflow.com/questions/28653484/swift-enums-normal-non-failable-initializers-not-supported-or-just-broken? Danke -c –

+1

Checked auf Xcode 7.0 (Beta 3) und 'Rank (rawValue:" One ")' korrekt initialisiert das Enum-Member ... – Zorayr

Verwandte Themen