English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift Optionale Typen (Optional)

In diesem Artikel werden Sie die Optionen, ihre Anwendungen und die Verarbeitung von Optionen in Swift lernen.

In dem vorherigen Artikel haben wir die verschiedenen Datenarten in Swift kennengelernt und haben auch bemerkt, dass die Variablen oder Konstanten, die diese Typen deklarieren, Standardwerte enthalten.

Beispiel:}

let someValue = Int()
print(someValue)

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

0

In Swift gibt es jedoch auch eine andere Datenart namens Optional, deren Standardwert ein leerer Wert (nil) ist. Wenn Sie möchten, dass der Variable oder der Konstanten kein Wert enthalten, können Sie Optional verwenden. Der optionale Typ kann einen Wert enthalten oder einen Wert nicht enthalten (leerer Wert).

Technisch gesehen können Sie es als optionale Schuhkiste betrachten. Die Schuhkiste kann Schuhe enthalten oder nicht. Daher sollten Sie, wenn Sie die Schuhe aus der Verpackung nehmen, vorher wissen.

Wie man eine optionale deklariert?

Sie können die Datenart Optional durch Anhängen einfach darstellen. Das Verfahren ist, das Typ hinzufügen! oder?. Wenn der Wert im optionalen Variable enthalten ist, wird der Wert als Optional <Value> zurückgegeben, sonst nil.

Beispiel1: Wie man in Swift eine optionale deklariert?

var someValue: Int?
var someAnotherValue:Int! =
print(someValue)
print(someAnotherValue)

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

nil
nil

Im obigen Programm haben wir mit ? und ! eine optionale Typ initialisiert. Beide Methoden können optionale Methoden erstellen, aber es gibt einen wesentlichen Unterschied, den wir unten besprechen werden.

Die Deklaration eines optionalen Int bedeutet, dass das Variable einen ganzzahligen Wert oder keinen Wert haben wird. Da keine Wert für das Variable zugewiesen wurde, können Sie auf dem Bildschirm zwei print-Anweisungen nil sehen.

Beispiel2: Wert von einem optionalen Objekt abrufen und zugreifen

let someValue: Int? = 5
print(someValue)
print(someValue!)

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

Optional(5)
5

Im obigen Programm haben wir eine optionale Int-Typ deklariert und einen Wert darin zugewiesen5.

Das Ausdrucken von Optional(someValue) gibt Ihnen nicht zurück5,sondern deklarieren Optional(5) hat die wie oben beschriebene Form: Optional <Value>. Um auf <Value> zuzugreifen, benötigen wir ein Verfahren namens Entpacken (Entpacken) das Mechanismus.

Sie können durch die in der Variable/Durch das Hinzufügen des Zeichens ! am Ende eines Konstanten wird der optionale Inhalt aufgelöst, wie in der folgenden Zeile gezeigt: print(someValue!). print(someValue!) löst den optionalen Inhalt auf und gibt ihn auf dem Bildschirm aus 5.

Bitte beachten Sie jedoch, dass dieses Entpackungsmechanismus nur dann verwendet werden sollte, wenn sicher ist, dass der Wert beim Zugriff auf die optionale Option tatsächlich vorhanden ist.

Beispiel3: Eine nicht verpackte optionale explizit deklarieren

Sie können auch auf die folgende Weise entpackte optionale Inhalte erstellen:

let someValue:Int! = 5
print(someValue)

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

5

Im obigen Programm erstellt Int! eine nicht verpackte optionale Inhalt, die bei Zugriff automatisch den Wert entpackt, sodass Sie nicht jedes Mal das !-Zeichen verwenden müssen.

Stellen Sie sicher, dass die Variable immer einen Wert hat, wenn Sie diese optionalen Optionen verwenden. Tun Sie dies nicht, wird es zu einem tödlichen Fehlerabsturz führen.

Beispiel4: Fataler Fehler beim Zugriff auf ein nulliges nicht-verpacktes optionales Objekt

var someValue: Int!
var unwrappedValue: Int = someValue //crashes due to this line

Wenn Sie das Programm ausführen, erhalten Sie einen tödlichen Fehlerabsturz: Unerwarteter nil-Wert beim Entpacken eines Optional-Werts, weil der Code unwrappedValue: Int = someValue versucht, den Wert aus dem Optional someValue dem Variable unwrappedValue zuzuweisen.

Allerdings ist somevalue ein Optional-Typ, der nil-Werte enthält. Der Versuch, einen nil-Wert einem Variable unwrappedValue (das ist kein Optional) zuzuweisen, führt zu einem Absturz.

Nachstehend werden verschiedene Methoden zur Verarbeitung dieses Falls erläutert.

Optionale Verarbeitung

Um optionale Werte zu verwenden, müssen Sie sie entpacken. Eine bessere Methode für die Entpackung optionaler Werte ist die bedingte Entpackung anstelle der erzwungenen Entpackung mit dem !-Operator.

Das ist, weil die bedingte Expansion fragtÜberprüfen Sie, ob dieser Variable ein Wert zugeordnet ist?. Wenn ja, geben Sie diesen Wert an, andernfalls behandeln Sie den nil-Fall.

Gegensätzlich bedeutet der erzwungene Auspacken, dass das Variable tatsächlich einen Wert hat, wenn es verwendet wird. Daher wird Ihr Programm eine Ausnahme auslösen und abstürzen, wenn Sie einen nil-Wert aus einem Optional entpacken, den Sie nicht erwartet haben. Nachstehend werden einige Techniken zur bedingten Expansion erläutert:

1.if-Statement

Sie können ein if-Statement verwenden und die optionale Parameter mit nil vergleichen, um zu erkennen, ob die optionale Parameter einen Wert enthalten. Sie können im if-Statement den Vergleichsoperator "Gleichheit" (==) oder den Vergleichsoperator "ungleich" (!=) verwenden.

Beispiel5: Optionale Verarbeitung mit if else-Statement

var someValue: Int?
var someAnotherValue: Int! = 0
        
if someValue != nil {
	print("Enthält Wert \(someValue!)")
}
	print("Does not contain a value")
}
        
if someAnotherValue != nil {
	print("Enthält Wert \(someAnotherValue!)")
}
	print("Does not contain a value")
}

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

does not contain a value
contains value 0

Im obigen Programm wird der Code im if-Statement ausgeführt, wenn die optionale Anweisung einen Wert enthält, sonst wird der Code im else-Block ausgeführt. Der Hauptnachteil dieser Methode für die optionale Verarbeitung ist, dass Sie immer noch den !-Operator verwenden müssen, um den Wert aus der Optionale zu entpacken.

2.Optionale Bindung (if let)

Optionale Bindungen können Ihnen helfen, zu erkennen, ob eine Optionale Werte einen Wert enthält. Wenn eine Optionale Werte einen Wert enthält, kann dieser Wert als temporäre Konstante oder Variable verwendet werden. Daher kann eine optionale Bindung mit einem if-Statement verwendet werden, um den Wert innerhalb der Optionale zu überprüfen und ihn in einer einzigen Operation als Konstante oder Variable abzurufen.

Beispiel5:使用if let语句的可选处理

var someValue: Int?
var someAnotherValue: Int! = 0
       
if let temp = someValue {
	print("Contains value \(temp)") 
}
	print("Does not contain a value")
}
        
if let temp = someAnotherValue {
	print("Contains value \(temp)")
}
	print("Does not contain a value")      
}

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

does not contain a value
contains value 0

In the above program, if the optional statement contains a value, the code in the if statement is executed. Otherwise, the else block is executed. if-The let statement also automatically unwraps the value and stores the unwrapped value in the temp constant. The main advantage of this method is that even though you can be sure that some optional content contains a value, you do not need to force unwrap the value.

3.Guard statement

You can also use the guard statement in Swift to handle optional content. If you don't know what guard is, don't worry. For now, just consider guard as if-There is no condition to prevent else. If the condition fails, the else statement is executed. Otherwise, the next statement is executed. More detailed information can be found inSwift Guard.

Beispiel6:使用Guard的可选处理

func testFunction() {
	let someValue: Int? = 5
	guard let temp = someValue else {
		return
	}
	print("It has some value \(temp)")
}
testFunction()

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

It has some value 5

In the above program, guard contains a condition, namely whether the optional someValue contains a value. If it contains a value, then guard-The let statement automatically unwraps the value and places the unwrapped value in the temp constant. Otherwise, the else block is executed, and it returns to the calling function. Since the optional contains a value, the print function is called. More details can be found in Swift guard.

4.空合运算符(??)

In Swift, you can also use the optional chaining operator to check if an optional contains a value. It is defined as (a??b). It unwraps an optional a, and if it contains a value, it returns it, or if a is nil, it returns the default value b.

Beispiel7:使用空合运算符的可选处理

var someValue: Int!
let defaultValue = 5
let unwrappedValue: Int = someValue ?? defaultValue
print(unwrappedValue)

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

5

Im obigen Programm ist die Variable someValue als optional definiert und enthält den Wert nil. Der leere Operator kann den optionalen Wert nicht auflösen und gibt daher defaultValue zurück. Daher gibt die Anweisung print(unwrappedValue) im Konsolenfenster aus5.

var someValue: Int? = 10
let defaultValue = 5
let unwrappedValue: Int = someValue ?? defaultValue
print(unwrappedValue)

Wenn Sie dieses Programm ausführen, lautet die Ausgabe:

10

Aber in dem obigen Programm wurde die optionale Variable someValue auf den Wert10。Daher hat der leere Operator erfolgreich den Wert someValue ausgepackt. Daher gibt die Anweisung someValue ?? defaultValue im Konsolenfenster aus10,Anweisung print(unwrappedValue) gibt aus10.