Das Ausrufezeichen in Swift: ! und ? — die geheime Bedeutung unter der Haube

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Das Ausrufezeichen in Swift: ! und ? — was verbirgt sich unter der Haube?



Haben Sie jemals auf fremden Swift-Code geschaut und seltsame Ausrufezeichen nach Variablen gesehen? userName!, viewController!, self.label!.text! — und sich gefragt: „Warum schreien sie?“. Diese Frage ist eine der beliebtesten auf Stack Overflow (tausende Aufrufe), und heute werden wir sie ein für alle Mal klären.



In diesem Artikel sagen wir nicht einfach „das ist Force Unwrapping“. Wir schauen unter die Haube des Compilers, analysieren, wie Swift den Speicher verwaltet, und zeigen, warum das Ausrufezeichen gleichzeitig Ihr bester Freund und schlimmster Feind ist. Los geht‘s!



Was ist ein optionaler Typ (Optional) und woher kommt !?



In Swift kann jede Variable als optional deklariert werden. Das bedeutet, sie kann einen Wert enthalten... oder nil (Leere). Warum? Damit Ihr Programm nicht abstürzt, wenn keine Daten vorhanden sind.



So sieht das aus:



var name: String? = "Anna"   // optionaler Stringvar age: Int? = nil          // ebenfalls optional, aber leer


Das Fragezeichen ? ist syntaktischer Zucker für Optional<String>. Das heißt, String? ist eigentlich Optional<String>.



Und jetzt das Wichtigste: Eine optionale Variable kann nicht direkt verwendet werden. Wenn Sie versuchen, print(name.count) zu schreiben, gibt der Compiler einen Fehler aus. Denn in name könnte nil stecken, und nil hat keine Eigenschaft count.



Und hier kommt das Ausrufezeichen ins Spiel.



! — das ist Force Unwrapping (erzwungenes Auspacken)



Wenn Sie name! schreiben, sagen Sie dem Compiler: „Ich bin sicher, dass ein Wert drin ist. Gib ihn mir einfach, ohne Prüfung.“ Der Compiler gehorcht und holt den Wert aus der „Box“ Optional.



var name: String? = "Anna"print(name!) // Gibt aus: Anna

var age: Int? = nilprint(age!) // CRASH! Fatal error: Unexpectedly found nil while unwrapping an Optional value


Deshalb mögen erfahrene Entwickler es nicht, ! übermäßig zu verwenden. Wenn Sie sich irren, stürzt das Programm ab. Es ist wie russisches Roulette mit dem Speicher.



Wie funktioniert das unter der Haube?



Stellen Sie sich vor, Optional sei eine verschlossene Box. Innen kann ein Wert liegen, oder sie kann leer sein. Force Unwrapping ist, wenn Sie ein Brecheisen nehmen und die Box aufbrechen, ohne hinzusehen. Wenn sie leer ist, zerstören Sie das Programm.



Im Compiler ist Optional eine Aufzählung (enum):



enum Optional<Wrapped> {    case none    // nil    case some(Wrapped)  // Wert}


Wenn Sie name! ausführen, generiert der Compiler ungefähr diesen Code:



switch name {case .some(let value):    // verwende valuecase .none:    fatalError("Unexpectedly found nil")}


Das heißt, ! ist nur eine Abkürzung für ein switch mit einer Prüfung auf nil, gefolgt von fatalError.



Implizit ausgepackte Optionals (Implicitly Unwrapped Optional) — ! im Typ



Manchmal sehen Sie Deklarationen wie var label: UILabel!. Das ist kein Force Unwrapping, sondern ein implizit ausgepacktes Optional. Sie sagen: „Ich verspreche, dass diese Variable vor der ersten Verwendung gesetzt wird, aber vorerst kann sie nil sein.“



var button: UIButton!  // implicit unwrapped optional

// Später...button = UIButton()button.setTitle("Drück mich", for: .normal) // Funktioniert ohne !


Unter der Haube ist es immer noch dasselbe Optional, aber beim Zugriff fügt der Compiler automatisch ein Force Unwrapping ein.

Blogs

Buchempfehlungen