2014-07-22 2 views
11

Der Name der ! verwirrt mich immer: Es wird als "implizit unwrapped optional" bezeichnet. Was beinhaltet das jedoch? Implizit bedeutet "angedeutet, aber nicht klar ausgedrückt". Allerdings fügt nicht eine ! deutlich seinen Zweck ausdrücken? Fügen Sie keine ! hinzu, machen Sie explizit, was wir erreichen wollen?Warum ist das! in Swift nannte ein "implizit" statt "explizit" ausgepackt optional?

+0

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

+0

Implizite und explizit mit ihrer Verwendung zu tun haben, nicht mit ihren Erklärungen. Sie gehen voran und versuchen, ein 'Optional ' nicht auszupacken und verwenden es wie ein einfaches' T' und kommen zu mir zurück. – CodaFi

+0

Große Frage. Ich habe darüber nachgedacht. Ich habe eher Apple-Entwickler gefragt :) – SoftDesigner

Antwort

6

Normale Optional

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

Implizit Unwrapped Optional

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

In beiden Fällen müssen Sie etwas ein optionales (? oder !) zu erklären. Implizit Unwrapped Optional fügt nicht mehr hinzu. Sie können jedoch den Unwrap-Operator weglassen, wenn Sie ihn verwenden.

18

In Swift werden nachgestellte Ausrufezeichen (!) auf zwei verschiedene Arten verwendet. Einer heißt Forced Unwrapping. Dies ist, wenn Sie eine Variable definiert als Optional und Sie wollen im Grunde behaupten, dass der Wert nicht gleich Null, so dass Sie es verwenden können, als ob es keine optional waren:

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

Eine alternative Art und Weisen Sie beschreiben könnten "Forced Unwrapping" ist "Explicit Unwrapping", aber forced fügt den zusätzlichen Hinweis hinzu, dass das gesamte Programm abstürzt, wenn Sie versuchen, ein optionales "Nil" -Einpacken "erzwingen".

Die zweite ist, wenn Sie tatsächlich den Typ einer Variablen deklarieren und es heißt . Dies ist der Fall, wenn Sie eine Variable deklarieren möchten, die technisch optional ist, die Sie jedoch so behandeln, als wäre sie nicht optional. Jedes Mal, wenn Sie diese Implizit verwenden Unwrapped Optional ist es in der Realität, die „Kraft Auswickeln“ tun ich oben beschrieben:

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

Sie können immer noch eine Implizit Unwrapped Optional für null testen, aber man kann es auch direkt verwenden, wie wenn es nicht optional wäre. Deshalb gilt es als implizit. Jedes Mal, wenn Sie es verwenden, ist es automatisch implizit für Sie ausgepackt.

Like „Forced Auswickeln“ eine „Implizit Unwrapped Optional“ wird immer noch das gesamte Programm abstürzen, wenn Sie versuchen, es zu verwenden, wenn es null

Verwandte Themen