In breve, (risposta al titolo) non lo era.
In dettaglio:
A me fa molto più senso di avere come un optional che non è costretto da scartare. Apple sta spingendo gli sviluppatori a non usare mai solo optional!
e ha senso solo che applichino le stesse regole alle API.
Il motivo è che può essere nullo e non fa alcuna differenza se è dichiarato con ?
o !
per l'esecuzione del codice. L'utilizzo di !
rimuove di fatto gli avvisi in Xcode, che sono davvero utili, specialmente quando si tratta di codice API. Se non ti rendi conto che in realtà è un optional, stai solo chiedendo dei problemi.
Il controllo di nil è ora molto più bello con guard
e puoi concatenarlo con un assegno per ""
quindi non è più un lavoro.
In generale le opzioni sono migliori perché qualcosa che è nullo non utilizza la memoria. Più opzioni abbiamo, più leggero possiamo fare le nostre app. Inoltre non sembra nemmeno male e non aggiunge alla piramide del destino.
Questo esempio prenderà entrambe le stringhe come argomenti, rimuovere ?
nel parametro func e Xcode sarà lì per avvisare.
Ho dimenticato di rispondere a questa parte direttamente: Essa diventa nullo quando lo si imposta a zero, il che si potrebbe fare per risparmiare un po 'di memoria. Non ha senso avere l'opzione di impostarlo su zero e non avere xcode ti avverta di gestirlo correttamente. => Questo è impossibile ...
var forcedUnwrappedString : String! = ""
var optionalString : String? = ""
forcedUnwrappedString = nil
optionalString = nil
func doSomethingWithString(string : String?) -> String? {
guard var unwrappedString = string else {
// error handling here
return nil
}
let tempString = unwrappedString + "!"
return tempString
}
func doSomethingUnsafeWithString(string : String) -> String {
let tempString = string
return tempString
}
var newString = doSomethingWithString(optionalString)
var newString2 = doSomethingWithString(forcedUnwrappedString)
newString = doSomethingUnsafeWithString(optionalString!) // this will crash without a warning fro xcode
newString2 = doSomethingUnsafeWithString(forcedUnwrappedString) // this will crash without a warning fro xcode
Aggiornamento:
La proprietà testo della UITextfield
ha un setter che imposta sempre a ""
in caso di nil
, nessuna informazione su questo articolo ovunque nella documentazione o in file della UIKit .h.
var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
var string = textField.text // string = ""
textField.text = nil
string = textField.text // string = ""
Per ulteriori dettagli, ho solo l'installazione di un parco giochi e ha fatto un UITextField. La proprietà text è infatti istantaneamente una stringa vuota * opzionale *. Ora sono più confuso – Will
Sembra che Apple non si fidi della loro API per darci sempre un valore non nullo per la proprietà text, quindi trasferiscono la responsabilità di 'guard' a noi. Non un fan di questo approccio. – teradyl