Xcode8 Beta6: Änderungen an Swift3

Swift ist lebendig. Gerade die letzten Updates haben immer wieder Neuerungen mitgebracht. Doch auch in der aktuellen Betaphase zu Swift3 haben sich auch kurz vor dem vermutlich anstehenden Release noch ein paar Änderungen ergeben. Die wichtigsten lernst Du in diesem Beitrag kennen.

Sichtbarkeit in Swift: private vs. fileprivate

In Swift gab es bereits das Keyword private. Das hat ein Eigenschaften und Methode vor dem Zugriff außerdem der Datei geschützt. Folgendes war also bspw. möglich:

Von jetzt an ist private ein noch höherer Schutz, da die Deklaration nur noch im aktuellen Gültigkeitsbereich verfügbar ist. Die Variable private ist – wie in vielen anderen Sprachen auch – nur noch in der Klasse Event erreichbar.

Für das bisherige Verhalten gibt es die neue Sichtbarkeit fileprivate. So würde das Beispiel ab Beta6 aussehen:

Für mich und die Kurse auf codingtutor.de hat es wenig Auswirkung. Ich finde es übersichtlicher jede Klasse, Erweiterung und Protokoll in einer eigenen Datei zu hinterlegen.

Objective-C Import: Any statt AnyObject (SE-0116 und SE-0072)

In Objective-C gibt es den generischen Typ id, der für jedes Objekt stehen kann. Importiert wurde er in Swift bisher als AnyObject. Durch den Antrag SE-0116 wird er nun als Any importiert.

Vereinfachte Worte zum Hintergrund: Problematisch sind bei dieser Verbindung die Value-Types in Swift. Aus dem Objective-C Reference-Type NSString wird der Value-Type String, aus NSArray wird Array und so weiter. Die neue Lösung geht darauf besser ein.

Gleichzeitig werden mit SE-0072 nun weitere „Altlasten“ beseitigt. In der Klasse AppDelegate werden viele Objective-C APIs verwendet. Bisher wurde die Methode application(_:didFinishLaunchingWithOptions:) mit dem impliziten Typ NSObject importiert:

Daraus wird nun der explizit verwendete Datentyp (und Any statt AnyObject):

Non-escaping Closure Parameters in Swift3

Bisher galten Closures, die an Funktionen oder Methoden übergeben wurden (z.B. Completion Handler) in Swift als „escaping“. Sie konnten also auch außerhalb der Funktion Werte ändern, bspw. in einer Eigenschaft der Klasse. Um das zu verhindern, stand @noescape zur verfügung.

Mit der Änderung SE-0103 hat sich das Verhalten gedreht. Alle Closures die als Parameter übergeben werden, gelten jetzt als „non-escaping“. Sollen doch Werte außerhalb verändert werden, müssen sie explizit als „escaping“ markiert werden. Dazu gibt es die @escaping Annotation.

So wurde es früher geschrieben:

Neu:

Da wird nun neben der Annotation noch eine Änderung sichtbar. Funktionstypen haben nun keine Argument Label mehr.

Funktionstypen ohne Label für Argumente (SE-0111)

Bisher konnten wie bei normalen Funktionen und Methoden die Funktionstypen explizit mit einem Label deklariert werden. Also bspw:

Das funktioniert so nicht mehr. In vielen Fällen sind bei der Deklaration wie hier die Label überflüssig. Es ist klar, dass mit zwei Int-Werten gerechnet wird. Sollte eine genaue Dokumentation sinnvoll sein, kann wie im Beispiel der Methode observeMessage das Label über die Wildcard optional angegeben werden:

Der Mehrwert besteht hier in inhaltlichen Dokumentation. Die Parameter sind nicht beliebig wählbar, sondern sind entsprechend Alter und Gewicht.

 

Das waren die wichtigsten Änderungen „kurz vor Ladenschluss“. Die komplette Liste ist in den Release Notes zu finden.

Schreib einen Kommentar

Your email address will not be published.