Sobes.tech
Middle

Wie wird die Öffnung (Optionen, Verträge und andere Mechanismen) in Swift implementiert?

sobes.tech KI

Antwort von AI

Optionale in Swift stellen einen Typ dar, der entweder einen Wert vom Typ T (eingepackter Wert) oder nil enthalten kann, was das Fehlen eines Wertes bedeutet.

Die wichtigsten Mechanismen zur Arbeit mit Optionals:

  1. Optionale Bindung (if let, guard let): Sicheres Extrahieren eines Wertes aus einem Optional.

    • if let: Extrahiert den Wert und weist ihn einer temporären Konstante oder Variablen zu, wenn das Optional einen Wert enthält. Der Codeblock wird nur in diesem Fall ausgeführt.
      let optionalString: String? = "Hello"
      if let unwrappedString = optionalString {
          // unwrappedString hat den Typ String
      }
      
    • guard let: Extrahiert den Wert. Wenn das Optional nil ist, wird der else-Block ausgeführt (normalerweise um den aktuellen Scope zu verlassen). Wenn der Wert erfolgreich extrahiert wurde, ist er nach guard im aktuellen Scope verfügbar.
      func processString(_ optionalString: String?) {
          guard let unwrappedString = optionalString else {
              return // Funktion verlassen
          }
          // unwrappedString ist hier vom Typ String
      }
      
  2. Optionale Verkettung (?): Ermöglicht das Aufrufen von Eigenschaften, Methoden und Indizes auf einem Optional. Wenn an irgendeiner Stelle der Kette das Optional nil ist, wird die gesamte Kette abgebrochen und das Ergebnis hat den Typ Optional, der nil enthält.

    class Person {
        var job: Job?
    }
    
    class Job {
        var salary: Double?
    }
    
    let person: Person? = Person()
    person?.job = Job()
    let salary = person?.job?.salary // salary hat den Typ Double?
    
  3. Erzwungenes Auspacken (!): Unsicheres Extrahieren eines Wertes. Führt zu einem Laufzeitfehler (Crash), wenn das Optional nil enthält. Sollte mit großer Vorsicht verwendet werden, nur wenn sicher bekannt ist, dass das Optional nicht nil ist.

    let requiredString: String! = "Must be present" // Implizit entpacktes Optional
    let unwrappedString = requiredString! // Erzwungenes Auspacken
    
    let dangerousOptional: String? = nil
    // let crash = dangerousOptional! // Führt zu einem Fehler
    
  4. Null-Koaleszenz-Operator (??): Bietet einen Standardwert, wenn das Optional nil ist.

    let optionalValue: Int? = nil
    let definiteValue = optionalValue ?? 0 // definiteValue wird 0
    
  5. Implizit entpackte Optionale (!): Optionale, die automatisch beim Zugriff entpackt werden. Werden mit ! deklariert. Sollten verwendet werden, wenn garantiert ist, dass der Wert vor der ersten Verwendung zugewiesen wird, aber nicht unbedingt bei der Initialisierung (z.B. IBOutlets). Beim Zugriff, wenn der Wert nil ist, tritt ein Laufzeitfehler auf.

    var button: UIButton! // Wird angenommen, in viewDidLoad initialisiert zu werden
    // button.setTitle("Tap me", for: .normal) // Automatisches Entpacken beim Zugriff
    

"Verträge" in diesem Kontext sind kein separates Sprachmechanismus in Swift, ähnlich wie Verträge in anderen Sprachen. Swift gewährleistet Sicherheit durch ein Typsystem, das Optionale und Zugriffskontrolle umfasst, was hilft, Absichten klar auszudrücken und Fehler zu vermeiden. Optionale dienen als "Vertrag", der auf die Möglichkeit des Fehlens eines Wertes hinweist.