zurück zum Artikel

Programmiersprache: Swift 5.3 erweitert die Syntax und den Paketmanager

Rainald Menge-Sonnentag
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.

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 [1] 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 [2] 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 [3] 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 [4] 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 [5] 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 [6] 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 [7] 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 [8] 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 [9].

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 [10] 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 [11] 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 [12] .strings-Datei und weitere Ressourcen lokalisiert bereitstellen. Schließlich sieht das Proposal SE-0273 [13] 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 [14] auf verbesserte Fehlermeldungen für das Debugging und Optimierungen bei inkrementellen Builds zielen, finden sich im Swift-Blog [15]. Binaries der Sprache sind auf der Download-Seite verfügbar [16], und Links auf den Sourcecode stehen im Blogbeitrag.

(rme [17])


URL dieses Artikels:
https://www.heise.de/-4903704

Links in diesem Artikel:
[1] https://github.com/apple/swift-evolution/blob/master/proposals/0266-synthesized-comparable-for-enumerations.md
[2] https://github.com/apple/swift-evolution/blob/master/proposals/0267-where-on-contextually-generic.md
[3] https://github.com/apple/swift-evolution/blob/master/proposals/0276-multi-pattern-catch-clauses.md
[4] https://github.com/apple/swift-evolution/blob/master/proposals/0279-multiple-trailing-closures.md
[5] https://github.com/apple/swift-evolution/blob/master/proposals/0286-forward-scan-trailing-closures.md
[6] https://github.com/apple/swift-evolution/blob/master/proposals/0268-didset-semantics.md
[7] https://github.com/apple/swift-evolution/blob/master/proposals/0277-float16.md
[8] https://github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.md
[9] https://github.com/apple/swift-evolution/blob/master/proposals/0263-string-uninitialized-initializer.md
[10] https://github.com/apple/swift-evolution/blob/master/proposals/0271-package-manager-resources.md
[11] https://github.com/apple/swift-evolution/blob/master/proposals/0271-package-manager-resources.md
[12] https://github.com/apple/swift-evolution/blob/master/proposals/0278-package-manager-localized-resources.md
[13] https://github.com/apple/swift-evolution/blob/master/proposals/0273-swiftpm-conditional-target-dependencies.md
[14] https://www.heise.de/news/Programmiersprache-Swift-5-2-setzt-auf-Komfort-und-Zuverlaessigkeit-4689742.html
[15] https://swift.org/blog/swift-5-3-released/
[16] https://swift.org/download/#releases
[17] mailto:rme@ix.de