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
undenum
, nicht fürclass
- 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 mitself.init()
einleiten.
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.