Programmiersprache: Swift 5.3 erweitert die Syntax und den Paketmanager

Apples Programmiersprache hat einige nützliche Ergänzungen für vorhandene Funktionen, und der Paketmanager erlaubt das Einbinden von Ressourcen und Binaries.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 5 Beiträge
Von
  • Rainald Menge-Sonnentag

Ein halbes Jahr nach Swift 5.2 ist nun Version 5.3 der Programmiersprache erschienen. Viele Neuerungen erweitern die Syntax unter anderem für Enums, Try-Catch-Blöcke und didSet-Callbacks. Die Anpassungen sollen vor allem Boilerplate-Code verringern und für übersichtlicheren Sourcecode sorgen. Auf der Seite der Infrastruktur wird der Swift Package Manager offenbar deutlich flexibler: Pakete dürfen unter anderem Bilder und binären Code enthalten.

Daneben bringt das Release einige Ergänzungen unter der Haube mit, die die Performance der kompilierten Anwendungen zur Laufzeit verbessern sollen. Der Binärcode ist zwar im Vergleich zu Objective-C immer noch größer, aber seit den Messungen zum Release von Swift 4 wohl deutlich gesunken, und zwar von seinerzeit der 2,3-fachen auf nunmehr die 1,5-fache Größe. Außerdem sollen Swift-5.3-Anwendungen deutlich weniger Heap-Speicher belegen als mit älteren Versionen kompilierter Code.

Eine optionale Anbindung zu Comparable für den enum-Typ führt das Proposal SE-0266 ein. Elemente einer derart deklarierten Enumeration lassen sich über Operatoren wie < und > vergleichen. Sollte für einen Operator eine explizite Implementierung existieren, hat dieser Vorrang vor der impliziten Umsetzung über Comparable.

Mit dem Proposal SE-0267 lassen sich where-Klauseln für Funktionen innerhalb generischer Typen nutzen. Erwähnenswert ist dabei, dass beim Überschreiben der Methode die Sichtbarkeit nicht geringer sein darf als bei der Originalmethode, wie das Beispiel aus dem Proposal zeigt:

class Base<T> {
    func foo() where T == Int { ... }
}

class Derived<T>: Base<T> {
    // OK, the substitutions for <T: Equatable> 
    // are a superset of those for <T == Int>
    override func foo() where T: Equatable { ... } 
}

Das Proposal SE-0276 beschreibt Multi-Pattern Catch Clauses: In Try-Catch-Konstrukten kann nun ein catch-Block mehrere Fehler behandeln wie in folgendem Beispiel der Entwickler:

do {
  try performTask()
} catch TaskError.someRecoverableError {    // OK
  recover()
} catch TaskError.someFailure(let msg),
        TaskError.anotherFailure(let msg) { // Also Allowed
  showMessage(msg)
}

Bisher waren für die Behandlung separate Blöcke notwendig, auch wenn sie jeweils dieselbe Syntax verwendet haben.

Trailing Closures lassen sich ebenfalls neuerdings bündeln, wie das Proposal SE-0279 beschreibt. Sie existieren als Kurzform bereits seit langer Zeit in Swift, und das Proposal erweitert den Einsatz um weitere Closures hinter der ersten, wobei die zusätzlichen Blöcke Labels aufweisen müssen. Die erste Closure bleibt ohne Label:

UIView.animate(withDuration: 0.3) {
  self.view.alpha = 0
} completion: { _ in
  self.view.removeFromSuperview()
}

Als Ergänzung führt das Proposal SE-0286 das Forward-scan Matching (von links nach rechts) der Parameterliste ein, die bisher über Backward-scan Matching (von rechts nach links) abgearbeitet wurde. Es soll Kompilierfehler durch das Zuordnen der falschen Parameter beim Vermischen von einfachen und multiplen Trailing Closures vermeiden.

Eine weitere Neuerung dürften die meisten Entwickler höchstens durch effizienteren Code wahrnehmen: Das Proposal SE-0268 betrifft die doSet-Observer einer Property, die aufgerufen werden, wenn sich der Wert ändert. Sie erhalten in Swift 5.3 nur dann den alten Wert über oldValue, wenn sie ihn tatsächlich verwenden.

Swift 5.3 führt zudem mit dem Proposal SE-0277 den Float16-Typ ein, also das Half-precision-Floating-Point-Format, das unter anderem in Machine-Learning-Anwendungen und bei der Grafikprogrammierung zum Einsatz kommt.

Nennenswerte Ergänzungen sind zudem das in SE-0281 eingeführte @main-Attribut, das den Einstiegspunkt in ein Programm deklariert und die neue Initialisierung für String mit Zugriff auf nicht initialisierte Speicherbereiche als Proposal SE-0263.

Der Swift Package Manager (SPM) ist im aktuellen Release deutlich flexibler. Bisher bestanden Pakete weitgehend aus Sourcecode, aber künftig kann der SPM weitere Inhalte und kompilierten Code verwalten. Das Proposal SE-0271 zu Package Manager Resources ermöglicht das Einbinden von Ressourcen wie Grafiken oder Datendatei in Swift-Paketen.

Auch das Verpacken von binärem Code ist nun möglich. Das dafür verantwortliche Proposal SE-0272 nennt zwei Hauptgründe für die Integration: Zum einen lassen sich Dependencies einbinden, die nicht im Source vorliegen, weil beispielsweise der Anbieter keinen Quellcode zur Verfügung stellt. Zum anderen können Entwickler auf die Weise komplexen Code kompiliert bereitstellen, der potenziell einen langen Build-Prozess benötigen würde.

Für verschiedene Regionen und natürliche Sprachen lassen sich dank dem Proposal SE-0278 .strings-Datei und weitere Ressourcen lokalisiert bereitstellen. Schließlich sieht das Proposal SE-0273 vor, dass einzelne Target Dependencies konditional sind, um die Anforderungen für unterschiedlichere Zielplattformen flexibler zu gestalten.

Weitere Neuerungen, die unter anderem wie bereits Swift 5.2 auf verbesserte Fehlermeldungen für das Debugging und Optimierungen bei inkrementellen Builds zielen, finden sich im Swift-Blog. Binaries der Sprache sind auf der Download-Seite verfügbar, und Links auf den Sourcecode stehen im Blogbeitrag.

(rme)