Swift 4.1

Swift 4.1 ist ein Minor Release, in dem sich Apple bemüht hat, einige Neuerungen unterzubringen ohne die Kompatibilität zu Swift 4.0 zu gefährden. Vorhandener Code sollte also unverändert laufen. Mit dem Update kommen Sie aber in den Genuss einiger neuer Features.

Neuerungen

Insgesamt gibt es in Swift 4.1 elf Neuerungen, die hier aufgelistet sind. Viele davon sind direkt oder indirekt Detailverbesserungen zum einfacheren und komfortableren Umgang mit generischen Ausdrücken. Die meisten Neuerungen haben allerdings nur wenig Relevanz für die tägliche Arbeit mit Swift. Ich konzentriere mich deswegen im Folgenden auf die Features, die voraussichtlich eine breite Anwendung finden werden.

Equatable und Hashable

Schon in Swift 4.0 haben Standarddatentypen wie Int, String, Date oder URL die Protokolle Equatable und Hashable erfüllt. In Swift 4.1 gilt dies auch für alle Index-Datentypen der Standardbibliothek (siehe SE-0188).

Ebenfalls neu in Swift 4.1 ist, dass diese Protokolle automatisch auch für eigene Datentypen erfüllt sind, die nur aus Elementen bestehen, die selbst Equatable und Hashable sind. Sie müssen also nur noch die Protokolle angeben, sich aber nicht um deren Implementierung kümmern (siehe SE-0185). Selbstverständlich ist es weiterhin erlaubt, die Implementierung selbst durchzuführen. Dazu geben Sie einfach eigenen Code für die Eigenschaft hashValue bzw. für den Operator == an.

// der für Hashable und Equatable erforderliche
// Code wird automatisch generiert
struct Person : Hashable, Equatable {
  var name: String
  var tel: String
  var mail: String
}

Allerdings gilt es Einschränkungen:

  • funktioniert nur für struct und enum, nicht für class
  • funktioniert nicht, wenn die Struktur Arrays oder vergleichbare Aufzählungen enthält
  • funktioniert nicht, wenn die Struktur statische Eigenschaften oder berechnete Eigenschaften (computed properties) enthält

compactMap-Methode

Mit der neuen Methode compactMap (siehe SE-0187) kann eine Transformationsfunktion auf Sequences angewendet werden. compactMap liefert als Ergebnis alle Elemente, die nicht nil sind.

Im folgenden Beispiel ist data ein Array mit String-Elementen. compactMap bildet daraus ein Array mit Integerzahlen, wobei nur jene Elemente enthalten sind, die sich in Zahlen umwandeln lassen (d.h., bei denen Int nicht nil liefert):

let data = ["1", "2", "3", "abc", "efg"]
let nmbs = data.compactMap { Int($0) }
nmbs  // [1, 2, 3]

Eine ähnliche Funktion bot schon bisher flatMap. Diese Methode gilt nun aber als deprecated, wenn sie für Transformationsfunktionen mit einem Optional als Ergebnis angewendet wird.

KeyPathes

Die in Swift 4 eingeführten KeyPathes funktionieren nun auch für Arrays und verschachtelte Konstruktionen:

class Rect {
  var x: Int, y: Int
  init(x: Int, y: Int) {
    self.x = x; self.y = y
  }
}

class Geometry {
  var descr = ""
  var data = [Rect]()
}

let r1 = Rect(x:2, y:3)
let r2 = Rect(x:7, y:2)
let g = Geometry()
g.data.append(r1)
g.data.append(r2)

// KePath zur Eigenschaft x des zweiten Array-Elements 
// innerhalb eines Geometry-Objekts
let pathToSecondRect = \Geometry.data[1].x
print(g[keyPath: pathToSecondRect])  // Ausgabe: 7

Kompatibilität und self.init()

Bei meinen Tests mit den Beispielprojekten aus meinem Swift-Buch sind keine nennenswerten Kompatibilitätsprobleme aufgetreten. Es sind aber die folgenden Punkte zu beachten:

  • Beim öffnen alter Projekte zeigt Xcode eine Warnung an und fordert Sie auf, ein Update auf die recommended settings durchzuführen, das zwei Compiler-Warnings aktiviert. Das erfordert zwei Mausklicks.

  • Bei einigen Projekten habe ich zudem die Dateien der SWXmlHash-Bibliothek aktualisieren müssen.

  • Wenn Sie Swift verwenden, um mit Low-Level-Sprachen entwickelte Strukturen zu erweitern, müssen Sie eigene init-Funktionen nun mit self.init() einleiten.

Init-Funktionen von Low-Level-structs müssen mit self.init() beginnen

Schnelleres SpriteKit im Simulator

SpriteKit-Apps laufen im Simulator nun wieder deutlich schneller als zuletzt. Idealerweise sollten Sie SpriteKit-Apps natürlich immer auf echter Hardware testen. Aber für erste Experimente reicht nun auch der Simulator wieder aus.

Quellen