Blogserie iOS-Entwicklung - Swift 1.2 und 2.0 im DetailDie Einführung von Apples neuer Programmiersprache Swift auf der WWDC 2014 war für so ziemlich jeden Entwickler und Beobachter unerwartet und überraschend. Auf der WWDC 2015 ging Apple dann noch einen Schritt weiter und verkündete, Swift und den zugrunde liegenden Compiler als Open Source für die Allgemeinheit freizugeben. Hier zeichnet sich klar ab, dass Apple mit Swift Großes vorhat und damit in die breite Masse drängen möchte. Nicht zuletzt die Tatsache, dass auf der WWDC 2015 in allen Keynotes nur Swift-Code zu sehen war, macht deutlich, wie stark Apple auf Swift fokussiert ist. Es ist davon auszugehen, dass Swift in den nächsten Jahren eine immer größere und präsentere Rolle bei Apple einnehmen und womöglich eines Tages Objective-C komplett ablösen wird.

Grund genug also, sich als App-Entwickler für iOS und/oder OS X im Detail mit Swift auseinanderzusetzen. Seit der Veröffentlichung des ersten Golden Master von Swift im Herbst 2014 hat sich einiges getan. So brachte Apple im April 2015 ein erstes kleines Update für Swift mit der Versionsnummer 1.2 heraus, im Herbst 2015 folgt der Release von Swift 2.0. Beide Updates ergänzen Swift um neue und sinnvolle Funktionen, ohne die im ersten Golden Master eingeführten Grundlagen und Basistechniken auszuhebeln. Somit ändern diese Updates nicht das Verhalten der Programmiersprache selbst, wodurch auch bei bestehenden Swift-Entwicklern kein Umdenken stattfinden muss. Stattdessen führte Apple neue Ergänzungen ein, die die Arbeit mit Swift erleichtern sollen und neue Funktionen zur Verfügung stellen.

 

Swift 1.2: die Verbesserungen auf einen Blick

Das erste Update für Swift im April 2015 hievte die Programmiersprache auf Version 1.2. Dieses Update brachte primär kleinere Verbesserungen und optimierte einige Sprachmerkmale von Swift.

Die erste große Verbesserung von Swift 1.2 bezog sich auf den Compiler, der zusammen mit der damaligen Version 6.3 von Xcode ausgeliefert wurde. Dieser setzt von diesem Zeitpunkt an auf sogenannte inkrementelle Builds, was dafür sorgt, dass nur noch diejenigen Dateien und Klassen kompiliert werden, die sich seit dem letzten Build auch tatsächlich geändert haben. Darüber hinaus erstellt der neue Compiler noch schnellere und performantere Apps, ohne dass wir Entwickler etwas dafür tun müssen.

Neben diesen großen Optimierungen des Compilers wartete dieser mit Xcode 6.3 noch mit weiteren Verbesserungen auf. So wurden diverse Warnungen und Fehlermeldungen verbessert, um klarer auf das jeweilige Problem aufmerksam zu machen. In diesem Zuge wurden auch neue Fix-its ergänzt, um im Idealfall ein solches Problem mit nur einem Klick in Xcode zu beheben. Auch wurden die bis dato häufigen Compiler-Abstürze behoben und die Stabilität des Compilers im Allgemeinen deutlich erhöht.

Neben den Verbesserungen am Compiler wurde aber auch die Sprache selbst mit Version 1.2 optimiert. Die größte Änderung betraf dabei den as-Operator, der für das Type Casting in Swift Verwendung findet. Statt einer Umwandlung mittels as muss nun der neue as!-Operator (mit Ausrufezeichen am Ende) für das Type Casting verwendet werden, um klar zu signalisieren, dass wir als Entwickler wissen, was wir da tun; schließlich kann ein Cast – falsch angewendet – auch fehlschlagen und damit zur Laufzeit zum Absturz der eigenen App führen.

Damit in bestehenden Swift-Projekten nun aber wir Entwickler nicht jeden einzelnen Cast mittels as selbst händisch zu as! ändern müssen, bietet Xcode einen Assistenten, der den aktuellen Swift-Code eines Projekts automatisch auf die aktuelle Version hievt. Dieser Assistent steht auch zum Update auf Swift 2 zur Verfügung und kann über das Menü über „Edit“ -> „Convert“ -> „To Latest Swift Syntax…“ aufgerufen werden.

Bild 1: Xcode bringt einen Assistenten mit, um Swift auf die neueste Version in bestehenden Projekten zu aktualisieren. Quelle: Xcode

Bild 1: Xcode bringt einen Assistenten mit, um Swift auf die neueste Version in bestehenden Projekten zu aktualisieren. Quelle: Xcode

 

Die Optimierungen von Swift 1.2

Der neue as!-Operator ist die einzige Neuerung in Swift 1.2, die Auswirkungen auf bereits bestehende Projekte hat. Alle weiteren Optimierungen sind neu und können ab Swift 1.2 genutzt werden. Dazu gehört beispielsweise die Möglichkeit, Konstanten zu einem späteren Zeitpunkt als zu ihrer Deklaration einen Wert zuzuweisen. Dadurch wird beispielsweise Code wie im Folgenden gezeigt möglich:

Listing 1: Zuweisung eines Werts für eine Konstante nach Deklaration

let myConstant: Int
if condition {
     myConstant = 19
} else {
     myConstant = 99
}

Statt also direkt bei der Deklaration einer Konstanten auch einen Wert zuzuweisen, können Sie diese Zuweisung mit Swift 1.2 auch auf einen späteren Zeitpunkt und eine andere Stelle im Code verschieben. Das ändert aber natürlich nichts daran, dass nach dieser erstmaligen Zuweisung keine erneute Wertzuweisung für diese Konstante stattfinden kann.

Ebenso wurde das if let-Konstrukt zum gleichzeitigen Abfragen und Entpacken von Optionals in Swift 1.2 optimiert. Damit können nun mehrere Optionals auf einmal abgefragt werden, was umfangreichen und verschachtelten Konstrukten entgegenwirkt, die bis Swift 1.2 leicht entstehen konnten. Das folgende Code-Beispiel stellt diese zwei Verfahren vor und ab Swift 1.2 gegenüber und zeigt damit deutlich, wie die Optimierung für wesentlich besser lesbaren Code sorgt:

Listing 2: Optimierung von if let

// Code bis Swift 1.2
if let firstUnwrapped = firstOptional {
   if let secondUnwrapped = secondOptional {
       if let thirdUnwrapped = thirdOptional {
           <do something...>
       }
   }
}

// Code ab Swift 1.2
if let firstUnwrapped = firstOptional, secondUnwrapped = secondOptional, thirdUnwrapped = thirdOptional {
   <do something...>
}

Beide Code-Beispiele tun genau dasselbe; es werden zunächst drei Optionals geprüft und einer Konstanten zugewiesen. Wurden alle Optionals erfolgreich entpackt, soll weiterer Code ausgeführt werden. Ab Swift 1.2 können diese Bedingungen nun in einer Befehlszeile kommasepariert aneinandergehängt und gekoppelt werden, wodurch die bis dato notwendigen verschachtelten Konstrukte der Vergangenheit angehören (vorausgesetzt natürlich, wir Entwickler machen Gebrauch von dieser Optimierung in Swift 1.2).

Die letzte große Neuerung in Swift 1.2 ist der neue Fundamental Type Set, der nun fester Bestandteil der Sprache ist. Er dient als Äquivalent zur Klasse NSSet des Foundation Frameworks und reiht sich in die Riege der bestehenden Fundamental Types wie Array oder Dictionary ein.

Daneben wartete Swift 1.2 mit noch mit weiteren kleinen Neuerungen auf. So können beispielsweise Enumerations in Swift von nun an auch in Objective-C zugänglich gemacht werden, indem diesen das bereits bekannte Schlüsselwört @objc bei der Deklaration vorangestellt wird. Ebenso wurde Objective-C erweitert, um nun ebenfalls mit dem Pattern der Optionals aus Swift umgehen zu können.

 

Swift 2.0: Konsequente Weiterentwicklung und Optimierung

Auf der WWDC 2015 wurde Swift 2.0 erstmals präsentiert und ist Bestandteil der neuen Version 7 von Apples Entwicklungsumgebung Xcode. Auch Swift 2.0 ändert nichts an den grundlegenden Funktionen und Merkmalen der Sprache, führt aber einige neue spannende Features ein, die bisweilen unter tosendem Applaus auf der WWDC von den Entwicklern aufgenommen wurden.

Eines der größten Highlights ist sicherlich das neue Error Handling Model in Swift 2. Dieses erlaubt es, Fehler direkt an der Stelle abzufangen, wo sie auftreten können, ohne erst mit Pointern auf NSError-Objekte arbeiten und diese auswerten zu müssen. Apple selbst hat dieses Error Handling Model komplett in seinen eigenen Frameworks umgesetzt, wodurch alle Methoden, die bisher ein (optionales) NSError-Objekt erwartet haben, nun mittels des neuen Error Handling Model in Swift umgesetzt werden.

Ob eine Methode in Swift 2 einen Fehler zurückgibt, bestimmt dabei das neue Schlüsselwort throws, welches nach den runden Klammern, die die Parameter enthalten, sowie vor einem möglichen Rückgabewert gesetzt wird. Das folgende Beispiel zeigt die Deklaration einer einfachen Methode nach dem neuen Error Handling Model:

func myMethod() throws -> String

So eine Funktion muss in Swift 2 innerhalb eines do-catch-Blocks aufgerufen werden, um auf einen möglichen Fehlerfall entsprechend reagieren zu können, so wie im folgenden Listing gezeigt:

Listing 3: Abfangen eines Fehlers mittels Error Handling Model

do {
   try <Methode mit throws aufrufen>
   <Auszuführender Code, wenn kein Fehler auftritt>
} catch {
   <Fehlerbehandlung>
}

Anhand dieses Patterns ist es auch möglich, mehrere verschiedene Fehler abzufangen und innerhalb mehrere einzelner catch-Blöcke abzufragen, um dann auf die entsprechenden Fehler unterschiedlich zu reagieren. Dabei können auch für eigene Funktionen neue Fehler-Typen definiert werden. Diese sind dann vom neuen Typ ErrorType abzuleiten.

 

Swift wird Open Source

Neben dem Error Handling Model haben es noch weitere sinnvolle Neuerungen in Version 2 von Swift geschafft. So gibt es das neue Schlüsselwört #availabe, mit dem Sie Code deklarieren können, der nur für bestimmte iOS- beziehungsweise OS X-Versionen gedacht ist. Ebenso können nun auch Extensions für Protokolle erstellt werden, was eines der am meisten gewünschten Features in Swift war. Und auch Objective-C wurde optimiert, um in Zukunft noch besser im Zusammenspiel mit Swift verwendet werden zu können.

Daneben machte Apple aber noch abseits der Neuerungen und Optimierungen eine Ankündigung auf der WWDC 2015, mit der so wohl niemand gerechnet hat: Swift wird Open Source. Zum Ende des Jahres hin soll der Quelltext veröffentlicht und erste Ports für OS X, iOS und Linux zur Verfügung gestellt werden, weitere sollen später folgen. Dabei werden die Standardbibliothek von Swift sowie der Swift Compiler für alle freigegeben.

Apple zeigt damit deutlich, dass sie Swift in die breite Masse bringen und möglichst weit verbreiten möchten. Ob ihnen das mit diesem Schritt gelingt, bleibt abzuwarten. Uns App-Entwickler kann es in jedem Fall freuen, zeigt es doch deutlich, dass Swift nun fester Bestandteil im Apple-Ökosystem und definitiv die präferierte Programmiersprache für iOS- und OS X-Apps ist.

Bild 2: Swift hat sich inzwischen definitiv als zu präferierende Sprache für iOS- und OS X-Apps etabliert. Quelle: https://developer.apple.com/swift/

Bild 2: Swift hat sich inzwischen definitiv als zu präferierende Sprache für iOS- und OS X-Apps etabliert. Quelle: https://developer.apple.com/swift/