2014-07-22 14 views
11

Il nome dello ! mi confonde sempre: si chiama "opzionale implicitamente da scartare". Tuttavia, che cosa è implicito a riguardo? Mezzi impliciti "impliciti anche se non chiaramente espressi". Tuttavia, non aggiunge un ! chiaramente esprimere il suo scopo? Non aggiungere un ! rende esplicito ciò che stiamo cercando di realizzare?Perché è il! in Swift chiamato opzionale 'implicitamente' piuttosto che 'esplicitamente' da scartare?

+0

http://en.wikipedia.org/wiki/Explicit_and_implicit_methods – XaxD

+0

implicito e esplicito hanno a che fare con il loro uso, non con le loro dichiarazioni. Vai avanti e prova a non scartare un 'Opzionale ' e usarlo come un semplice 'T' e tornare da me. – CodaFi

+0

Ottima domanda. Ho pensato allo stesso modo. Preferirei chiedere agli sviluppatori Apple :) – SoftDesigner

risposta

6

Normale opzionale

var foo : Foo? = Foo() 
foo!.doSomething() // explicitly unwrap it and call the method 

Implicitamente Unwrapped opzionale

var foo : Foo! = Foo() 
foo.doSomething() // implicitly unwrap it and call the method just like it is not optional 

In entrambi i casi, è necessario qualcosa di dichiarare un optional (? o !). Opzionalmente Unwrapped Opzionale non aggiunge altro. Ma puoi omettere l'operatore di scartare quando lo usi.

18

In Swift, i punti esclamativi finali (!) vengono utilizzati in due modi diversi. Uno si chiama Forced Unwrapping. Questo è quando si dispone di una variabile definita come opzionale e si desidera far valere in sostanza che il valore non è pari a zero in modo che si può utilizzare come se non fosse un optional:

var optionalName: String? = "World" 
if optionalName != nil { 
    sayHelloTo(optionalString!) 
} 

Un modo alternativo si potrebbe descrivere "Forced Unwrapping" è "Explicit Unwrapping", ma forzato aggiunge il suggerimento in più che l'intero programma si bloccherà se proverai a "Force Unwrap" un optional che è nullo.

Il secondo è quando in realtà si dichiara il tipo di una variabile e si chiama Implicitly Unwrapped Optional. Questo è per quando si vuole dichiarare una variabile che è tecnicamente facoltativa, ma che si tratterà come se non fosse facoltativa. Ogni volta che si utilizza questo Implicitamente Unwrapped opzionale, è in realtà, facendo la "Forza Scartare" ho descritto sopra:

var name: String! = "World" 
if name != nil { 
    sayHelloTo(name) 
} 

Si può ancora provare un'Implicitamente Unwrapped opzionale per nil, ma è anche possibile utilizzarlo direttamente come se non fosse facoltativo. Questo è il motivo per cui è considerato implicito. Ogni volta che lo usi, è automaticamente, implicitamente scartato per te.

Come "Scartare forzata" di un "Implicitamente Unwrapped opzionali" sarà ancora in crash l'intero programma, se si tenta di utilizzare quando è nullo

Problemi correlati