2016-09-26 4 views
1

Ich lerne die schnelle Syntax und wurde ein wenig mit dem optionalen Typ verwirrt. Aus der Definition kann also ein schneller Typ den Nullwert nicht speichern, es sei denn, er ist explizit als optional definiert. Also, was enthält die Variable in der folgenden Zeile, wenn sie deklariert wird?Swift Optionals, Unwrapping

var a:Int (declaring a variable without intializing it working fine in swift 3) 

Und auch wenn wir eine Variable als optional mit einem „!“ Erklären,

var optionalSquare: Square! = Square(sideLength: 10, name: "Optional Square") 

, wenn wir die „optionalSquare“ Variable verwenden möchten, wir brauchen es nicht, weil wir auspacken bin sicher (ich denke, dass wir deshalb "!" anstelle von "?" verwenden), es enthält keinen Nullwert. Warum erklären wir es nicht als normale Variable?

Bitte korrigieren Sie alle falschen Aussagen. Vielen Dank.

Antwort

2

was tut [var a:Int] enthält, wenn es

nichts erklärt wird. Sein Wert ist nicht definiert. Vor dem Zuweisen eines Werts wird ein Kompilierungsfehler verwendet. Sie können deklarieren es ohne es zu initialisieren, aber Sie können nicht verwenden es.

Dies ist Teil der Sicherheitsphilosophie von Swift: In C könnten Sie auch eine Variable nicht initialisiert lassen und ihr Wert wäre undefiniert, aber der Compiler würde (standardmäßig) keinen Fehler melden, wenn Sie ihn verwenden.

Also warum deklarieren wir es nicht als normale Variable.

Es gibt keinen Grund, dass ich denken kann, ein implizit ausgepackten optional eine lokale Variable zu machen. Die Funktionalität ist für Eigenschaften ("Ivars") auf Strukturen oder Klassen vorgesehen. Sie sollten sie verwenden, wo es unmöglich ist, die Eigenschaft in init des Objekts festzulegen, aber es ist sicher, dass der Wert vorhanden sein wird, bevor das Objekt verwandt wird.

IBOutlet s sind wahrscheinlich der kanonische Anwendungsfall. Eine weitere nützliche Anwendung ist das Festlegen einer Eigenschaft, indem eine Methode in init aufgerufen wird.

+0

danke für die Antwort. – Swifty

0

Sie können eine nicht optionale Variable deklarieren und nicht initialisieren - der Compiler beschwert sich nicht, solange Sie nicht diese Variable verwenden. Also dieser Code

var num: Int 

wird keinen Fehler generieren. Allerdings, wenn Sie diese Variable vor der Initialisierung verweisen, schlägt fehl Kompilation

var num: Int 
print(num) 

Im ersten Fall gibt es keine Fehler, da die Initialisierung verschoben werden kann. Sie können eine Variable deklarieren und danach 100 Zeilen initialisieren. Solange Sie es nicht vor der Initialisierung referenzieren, sind Sie in Ordnung.

Um Ihre zweite Frage zu beantworten, ist es richtig zu sagen, dass es in vielen Fällen nicht sinnvoll ist, eine implizit unverpackte Variable zu deklarieren und kontextuell zu initialisieren: eine nicht optionale Variable ist geeigneter.

1

Also, was enthält die Variable in der folgenden Zeile, wenn sie deklariert ist.

Es ist egal, weil Sie sowieso nicht darauf zugreifen können. Eine solche Erklärung sagt Swift, dass Sie sich später für den Wert entscheiden werden. Das Lesen der Variablen vor dem Zuweisen ist ein Fehler, den der Compiler auffangen wird.

Warum deklarieren wir [Variablen mit erzwungener Entpackung] nicht als normale Variablen?

Da möchten Sie möglicherweise nil in dieser Variable zu den Zeiten speichern, wenn es nicht verwendet werden sollte.

Zum Beispiel sollten Sie machen IB zugewiesene Eigenschaft implizit ausgepackt, weil sie nil sein müssen, bevor NIB Objekte „aufgeblasen“ sind, aber nach dem init Verfahren abgeschlossen ist:

@IBOutlet private weak var myLabel: UILabel! 

Um zu machen myLabel nicht optional, Sie müssten weak fallen lassen. Auf der anderen Seite möchten Sie kein Ausrufezeichen für jeden Zugriff von verwenden, da Sie sicher wissen, dass es initialisiert werden muss.

Die gleiche Argumentation gilt für andere Variablen, die nicht optional sein sollen, aber nicht in einem Initialisierer zugewiesen werden können.

Verwandte Themen