ho intenzione di prendere una pugnalata a questo, anche se questa domanda è stata intorno per un po 'perché penso che un po' di codice sorgente di esempio sarebbe utile per comprendere ciò che è per init!
(almeno lo è stato per me)
un implicitamente opzionale scartare fornisce due cose di valore:.
- una comodità per il programmatore (in modo da non dovete continuare a digitare '
?
' alla fine delle vostre variabili facoltative), e
- efficienza Runtime, perché permette di testare un optional per
nil
solo una volta, e successivamente (purché non sia nil
) usa il suo unwrapped (es. diretto) valore.
La parte importante è però che un opzionale implicitamente scartare è ancora un optional, che significa che può essere testato per nil
.
Ora, per l'utilità del init!
inizializzatore -failable, siamo in grado di utilizzare per ottenere le due cose che ho elencato sopra (la convenienza e l'efficienza di esecuzione), pur consentendo una funzione init
a fallire (vale a dire per tornare nil
) . Ciò può accadere, come altri hanno notato, chiamando in API Objective-C, ma può anche accadere direttamente dal codice che potresti scegliere di scrivere. Ecco un esempio:
class A {
init!() {
return nil // something happens that causes init to fail
}
}
var a:A! = A() // variable 'a' *is* an optional, and also nil
if a != nil { // and we can test it!
print("a is not nil")
} else {
print("a is nil, better not use it.")
}
In questo esempio, mi sono dato un modo per fallire l'inizializzazione di class A
, e sì, potuto facilmente essere fatto con un metodo init?
, ma quando creo un oggetto di tipo A
Probabilmente avrò solo bisogno di testare che l'inizializzazione sia riuscita o meno una volta - dopotutto, ho creato un A o non l'ho fatto - e poi se non è nil
voglio solo usare il valore diretto. Quindi, in questo caso, l'uso dell'inizializzatore init!
-file risulta molto utile.
L'OP non chiedeva informazioni sugli inizializzatori in Swift in generale, ma sullo specifico inizializzatore 'init!' Failable –