2014-10-18 18 views
12

sto usando parco giochi Xcode 6 di provare enumerazioni a Swift:di enum non riconosciuto

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

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

voglio ignorare init in modo che l'enum può essere inizializzato usando il suo rawValue come argomento. Ma ottengo un errore:

enter image description here

Ma secondo il Apple's Swift guide il mio codice dovrebbe essere corretto.

risposta

10

la risposta di Martin ha perfettamente ragione.

Ecco un'altra vista che risponde più direttamente alla tua domanda.

In Xcode 6.0, un enum non ha una proprietà rawValue. rawValue è stato aggiunto in Xcode 6.1, ma si noti che è una proprietà di sola lettura , quindi non è possibile assegnarlo anche in Xcode 6.1.

In Xcode 6.1, non è necessario implementare un inizializzatore che prende uno rawValue perché è già stato fornito in modo nativo dalla lingua. Se si stava tentando di imitare il comportamento in Xcode 6.0, allora si potrebbe provare qualcosa di simile:

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

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

ma il problema con questo è che fromRaw restituisce un valore enum facoltativa perché la stringa rawValue potrebbe corrispondere a qualsiasi valore enum.

Quindi cosa fai a questo punto? Si potrebbe aggiungere un ! per forzare scartare il valore:

self = Rank.fromRaw(rawValue)! 

ma questo potrebbe andare in crash se si è tentato di creare un enum con un valore grezzo non valido.

Si potrebbe trattare uno dei valori enum come un default e utilizzare il nil coalescenza operatore?? a scartare tranquillamente:

self = Rank.fromRaw(rawValue) ?? One 

che eviterebbe un incidente, ma probabilmente portare a inaspettati comportamento da parte del tuo programma.

Ciò che non è possibile fare in Xcode 6.0 è il init restituire un valore facoltativo. Questa funzionalità è stata aggiunta in Xcode 6.1 ed era esattamente questa nuova funzionalità che permetteva loro di cambiare fromRaw() da una funzione in Xcode 6.0 a un inizializzatore opzionale in Xcode 6.1.

14

I metodi di conversione tra enumerazione e i loro valori non elaborati sono stati modificati tra Xcode 6.0 e Xcode 6.1. Il metodo fromRaw() e toRaw() sono stati sostituiti da un (failable) initializer e una proprietà rawValue:

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

Sapete se gli inizializzatori normali/non disponibili non sono supportati o sono solo guasti? http://stackoverflow.com/questions/28653484/swift-enums-normal-non-failable-initializers-not-supported-or-just-broken? Grazie -c –

+1

Controllato su Xcode 7.0 (beta 3), e 'Rank (rawValue:" One ")' inizializza correttamente il membro enum ... – Zorayr