Swift 5.3

Zusammen mit Xcode 12 hat Apple im September 2020 auch Swift 5.3 freigegeben. Die neueste Swift-Version zeichnet sich durch viele Verbesserungen »unter der Haube« aus (höhere Kompiliergeschwindigkeit, klarere Fehlermeldungen, bessere Einrückungen im Editor); neue Sprach-Features sind dagegen kaum zu finden. Dafür gibt es aber interessante Neuerungen im Swift-Umfeld, beispielsweise:

  • eine Windows-Version (die ich nicht getestet habe)
  • die neue Standardbibliothek »Swift System«, die vor allem für Linux-Entwickler interessant ist
  • die neue Bibliothek »Swift Atomics« für atomare Operationen in asynchronem Code
  • Verbesserungen beim Paketmanager

Ich beschränke mich im Folgenden auf die interessantesten neuen Features, die für die alltägliche Programmierung relevant sind.

Mehrere nachgestellte Lambda-Ausdrücke

Von Anfang an war es in Swift üblich, dass die im letzten Parameter einer Methode anzugebende Funktion als nachgestellter Lambda-Ausdruck übergeben werden darf, also:

let data = [1, 2, 3]
let result1 = data.map( { $0 * $0 } )  // Lambda-Ausdruck als Parameter
let result2 = data.map { $0 * $0 }     // nachgestellter Lambda-Ausdruck

Ab Swift 5.3 ist das auch für mehrere Lambda-Ausdrücke erlaubt (siehe SE-0279). Dem ersten Lambda-Ausdruck wird wie bisher kein Parametername vorangestellt. Alle anderen Lambda-Ausdrücke müssen aber mit einem Label bezeichnet werden. Die häufigste Anwendung ist bei SwiftUI-Projekten zu erwarten, z.B. bei einem Button. Es ist aber zweifelhaft, ob die neue Syntax den Code besser lesbar macht:

// bisher: Action-Lambda-Ausdruck IN der Parameterliste,
//         Label-Lambda-Ausdruck nachgestellt
Button(action: { counter += 1 }) {
     Text("Drück' mich")
}

// neu: beide Lambda-Ausdrücke nachgestellt,
//      der zweite Ausdruck muss beschriftet werden
Button { counter += 1 }
   label: { Text("Drück' mich") }

Vergleiche von Enumerationselementen

Wenn Sie bei der Deklaration einer Enumeration das Protokoll Comparable verwenden, können die Enumerationselemente ohne weiteren Code verglichen werden. Das erste Enumerationselement gilt als das kleinste, das letzte ist das größte. Mehr Details: SE-0266

enum Size: Comparable {
   case small
   case medium
   case large
   case xlarge
}

let cup1 = Size.medium
let cup2 = Size.xlarge
print(cup1 < cup2)  // true

Implizites self

Die Swift-Syntax erforderte bisher beim Zugriff auf das aktuelle Objekt in einem Lambda-Ausdruck die explizite Nennung von self. In vielen Fällen darf self nun entfallen, was zu kompakterem, besser lesbaren Code führt (siehe auch SE-0269).

Mehrfach-catch

Swift erlaubt jetzt dank SE-0276, mehrere catch-Fälle zusammenzuziehen:

do {
  // kritischer Code
} catch MyErrors.a, MyErrors.b {
  // Reaktion auf die Fehler a und b gleichzeitig
}

Datentyp Float16

Der neue Datentyp Float16 verbessert die Kompatibilität zu externen Bibliotheken (häufig aus dem KI-Bereich). Der Zahlenbereich beträgt ca. +/- 65.000, die Genauigkeit nur etwas mehr als drei Stellen.

Quellen

PS: Vergleichsweise wenig Neuerungen gab es zu Swift 5.2. Auf dieser Website gibt es dazu keinen Blog-Beitrag. Mehr Details finden Sie bei Bedarf hier: