Ho avuto difficoltà a implementare correttamente il protocollo ForwardIndexType
per un enum, in particolare la gestione del caso finale (vale a dire per l'ultimo elemento senza un successore). Questo protocollo non è veramente coperto nel libro Swift Language.Implementazione di un enum ForwardIndexType
Ecco un semplice esempio
enum ThreeWords : Int, ForwardIndexType {
case one=1, two, three
func successor() ->ThreeWords {
return ThreeWords(rawValue:self.rawValue + 1)!
}
}
La funzione successor()
restituirà il valore enumeratore successivo, eccetto per l'ultimo elemento, dove sarà sicuro con un'eccezione, perché non v'è alcun valore dopo .three
Il ForwardTypeProtocol
non consente a successor()
di restituire un valore condizionale, quindi non sembra esserci alcun modo di segnalare che non vi è alcun successore.
Ora, usando questo in un ciclo for per scorrere l'intervallo chiuso di tutti i possibili valori di un'enumerazione si corre in un problema per il caso fine:
for word in ThreeWords.one...ThreeWords.three {
print(" \(word.rawValue)")
}
println()
//Crashes with the error:
fatal error: unexpectedly found nil while unwrapping an Optional value
Swift chiama inspiegabilmente la funzione successor()
di il valore finale dell'intervallo, prima di eseguire le istruzioni nel ciclo for. Se il campo viene lasciato socchiusa ThreeWords.one..<ThreeWords.three
quindi il codice viene eseguito correttamente, la stampa 1 2
Se modifico la funzione successore in modo che non cerca di creare un valore più grande di .three
come questo
func successor() ->ThreeWords {
if self == .three {
return .three
} else {
return ThreeWords(rawValue:self.rawValue + 1)!
}
}
Poi il per loop non si blocca, ma manca anche l'ultima iterazione, stampando come se la gamma fosse semiaperta 1 2
La mia conclusione è che c'è un errore in iterazione del ciclo di swift; non dovrebbe chiamare successor()
sul valore finale di un intervallo chiuso. In secondo luogo, il ForwardIndexType
dovrebbe essere in grado di restituire un optional, per poter segnalare che non esiste un successore per un certo valore.
Qualcuno ha avuto più successo con questo protocollo?
che risucchia perché ora tutte le mie istruzioni switch enum sono infettati con un caso predefinito richiesto – nielsbot