2354999

Swift 4.2 und Xcode 10: Das ist neu für Entwickler und Nutzer

11.06.2018 | 11:38 Uhr |

Die WWCD 2018 ist vorbei, nun liegen alle Fakten auf dem Tisch. Was hat Apple beim Entwicklerwerkzeug Xcode und bei der Programmiersprache Swift angepackt? Wir haben uns die wichtigsten Neuerung herausgesucht.

Die schlechte Nachricht gleich vorweg: Swift 5.0 muss noch bis 2019 warten. Viele Auguren hatten den großen Versionsschritt bereits in diesem Jahr erwartet, doch daraus wird leider nichts. Die große Änderung in Swift 5 dürfte die ABI-Stabilität sein, an der Apple sogar zusammen mit vielen externen Entwicklern schon länger intensiv arbeitet .

Doch auch Swift 4.2 hat einige Leckerbissen zu bieten. Eine wichtige Neuerung, die direkt mit der Sprache zu tun hat, betrifft Zufallszahlen.

Den Zufallszahlengenerator braucht man beispielsweise, wenn man Objekte per Zufall auf dem Bildschirm positionieren oder in zufällige Richtungen bewegen will. Spiele können auf Zufallszahlen dabei in keinem Fall verzichten. Die Bewegungsmuster von nicht menschlichen Gegnern zum Beispiel in 3D-Shootern setzt ganz stark auf Zufallszahlen. Auch Künstliche Intelligenz im Alltag muss immer wieder Zufallszahlen einsetzen, damit sie nicht immer dieselbe Reaktion zeigt. Siri beispielsweise antwortet auf dieselbe Frage nicht immer mit einer genau gleichlautenden Antwort. Auch hier sind Zufallszahlen im Spiel, die aus einer ganzen Anzahl an möglichen Antworten eine zufällig herauspicken.

Das Thema ist alles andere als trivial, denn wirklich zufällige Zahlen sind gar nicht so einfach zu erzeugen. Swift bediente sich hier bislang einer Funktion, die noch auf den Unix-Kern zurückgreift.

Die Folge war eine unglaublich komplizierte Syntax. Um beispielsweise eine zufällige Zahl zwischen -Pi und +Pi (- 3,1415926 und + 3,1415926) zu erhalten, musste man folgende Zeile in Swift eingeben:

Die alte Syntax für Zufallszahlen war sehr verwirrend und komplex
Vergrößern Die alte Syntax für Zufallszahlen war sehr verwirrend und komplex

Der Code enthält insgesamt vier Datentyp-Konversionen, die das Ganze ziemlich unleserlich machen. Außerdem folgt die Verteilung der Zufallszahlen der Gauß'schen Normalverteilung. Zahlen am oberen und unteren Rand des Zahlenbereichs kommen also seltener vor, als in der Mitte. Ab Swift 4.2 sieht das nun so aus:

Die neue Syntax ist viel klarer und universeller einsetzbar, aber leider auch langsamer.
Vergrößern Die neue Syntax ist viel klarer und universeller einsetzbar, aber leider auch langsamer.

Nur noch eine kurze Zeile, bei der auf den ersten Blick klar wird, was hier passiert. Man bekommt ohne Datentyp-Konversionen direkt den gewünschten Typ (in diesem Fall „Double") zurück, und die Verteilung der Zufallszahlen ist nun linear.

Wer allerdings glaubt, die neue Funktion bringe auch einen Geschwindigkeitsgewinn, wird leider enttäuscht. Wir haben eine kleine Mac-App geschrieben (läuft auch unter macOS 10.13) , die die neue Zufallszahlenfunktion bei verschiedenen Datentypen testet. Unsere Benchmarks ergeben, dass die neue Funktion insgesamt deutlich langsamer arbeitet. Ganz besonders beim Datentyp "CGFloat", den man beispielsweise zum Positionieren von Objekten auf dem Bildschirm benutzt, ist der neue Zufallszahlengenerator etwa um den Faktor sieben (!) langsamer.

Unser kleines Benchmark-Tool offenbart: der neue Random-Generator ist zwar deutlich einfacher anzuwenden, arbeitet aber auch spürbar langsamer
Vergrößern Unser kleines Benchmark-Tool offenbart: der neue Random-Generator ist zwar deutlich einfacher anzuwenden, arbeitet aber auch spürbar langsamer

Warum das so ist, ist derzeit nicht ganz klar. Vermutlich muss sich die Methode der neuen Funktion jedes Mal durch die gesamte Swift-Objekthierarchie hangeln, was Zeit kostet. Es könnte allerdings auch am Zufallszahlenalgorithmus selber liegen, der durchaus rechenaufwändiger sein könnte. Unser Tipp: Wenn Sie, beispielsweise in einem Spiel darauf angewiesen sind, extrem viele Zufallszahlen möglichst schnell zu erzeugen, sollten Sie besser bei der alten Syntax bleiben, die zum Glück nach wie vor funktioniert.

Weitere Verbesserungen in Swift 4.2

Die gute Nachricht: Der Swift-Compiler ist, was die Build-Time für komplette Projekte angeht, um bis zu 2,4 mal schneller geworden, das hängt natürlich auch von der verwendeten Hardware, also CPU-Takt und Anzahl der Kerne ab.

Desweiteren hat man in Swift 4.2 auch unter der Haube an der Runtime ordentlich optimiert. Beispielsweise bei Lebenszeit und der Speicherfreigabe von Variablen in Funktionen, die nun auch funktionsübergreifend am Leben gehalten werden und nicht jedesmal neu Speicher alliieren und wieder freigeben müssen. Das bringt Geschwindigkeit im finalen Code. Verändert wurde auch der binäre Aufbau von Strings. Statt bisher 24 Bytes belegt ein String jetzt nur noch 16 Bytes im Speicher. Auch das ist ein Schritt in Richtung ABI-Stabilität, denn nachdem diese einmal erklärt ist, darf sich an solchen grundlegenden Definitionen nichts mehr verändern. Der verringerte Speicherbedarf für Strings sorgt für besser optimierte Programme und für mehr Geschwindigkeit, denn wenn ein String nur maximal 15 Zeichen lang ist, kann Swift ihn direkt bearbeiten, ohne einen Speicherbuffer vom System anzufordern. Außerdem gibt es einen neuen Optimierungs-Level, der die Größe einer fertig kompilierten App deutlich verringern soll.

Neuheiten in Xcode 10

Hurra, Xcode 10 unterstützt ab Werk den neuen Nachtmodus von macOS 10.14 Mojave. Darauf haben wirklich viele Entwickler gewartet, denn in der Developer-Szene mag man düstere Szenarien, aus welchen Gründen auch immer. Schaltet man in Mojave auf den Nachtmodus um, erscheint auch die komplette IDE von Xcode im dunklen Teint, das sieht echt edel aus! Es gibt auch Hilfen und Tools, wenn man selber Apps schreiben will, die den Nachtmodus unterstützen sollen. Man kann in den Assets beispielsweise Grafiken doppelt ablegen, die einmal für den normalen Modus und einmal für den Dark-Mode gedacht sind. Letztere könnte man beispielsweise etwas dunkler halten. Je nachdem, ob der Benutzer den Dark-Mode eingeschaltet hat oder nicht, werden nun die dunklen oder normalen Grafiken in der App angezeigt.

Object-Library

Apple hat die Objektbibliothek nun aus der Inspektoren-Palette herausgelöst. Man ruft sie jetzt über ein Icon am oberen rechten Bildrand oder über ein Shortcut (Befehl-Umschalt-L) auf. Die Library erscheint dann losgelöst auf dem Bildschirm – ganz ähnlich wie das Spotlight-Fenster – und man kann sofort lostippen, um bestimmte Interface-Objekte zu suchen. Im Code-Editor kommt man so statt an die Objektbibliothek an die Code-Snippets. Ein tolles Feature, an das man sich beim Design der Benutzeroberfläche ganz schnell gewöhnt hat.

Die Object Library erscheint nun auf Tastendruck ähnlich wie das Spotlight-Fenster, und sie lässt ich beliebig auf dem Bildschirm platzieren.
Vergrößern Die Object Library erscheint nun auf Tastendruck ähnlich wie das Spotlight-Fenster, und sie lässt ich beliebig auf dem Bildschirm platzieren.

  Editor Overscroll

Ein kleines, aber lang herbeigesehnten Feature ist Overscroll im Code-Editor. Scrollt man ganz ans Ende eines Code-Files, lässt sich der Code bis etwa zur Mitte (die Größe des Bereichs ist sogar in den Xcode-Einstellungen unter "Text Editing" einstellbar) des Editors hoch scrollen und darunter erscheint Freiraum. Dadurch stehen auch die letzten Codezeilen in der Mitte des Bildschirms und werden nicht ganz unten an den Rand gequetscht.

Das neue Overscroll-Feature im Code-Editor sorgt für Platz am Ende eines Code-Files
Vergrößern Das neue Overscroll-Feature im Code-Editor sorgt für Platz am Ende eines Code-Files

Code-Folding

Große Projekte brauchen Übersicht, über das so genannte Code-Folding ließen sich bislang schon Klassen und Funktionen einklappen und somit auf eine einzige Zeile reduzieren, das reduziert den Scroll-Aufwand im Code erheblich. Durch das neue Folding-Ribbon wird das Code-Folding deutlich granularer, denn man kann nun auch innerhalb von Funktionen einzelne Blöcke, beispielsweise eine For-Loop einklappen. Das Code-Folding muss man allerdings erst einmal in den Einstellungen unter "Text Editing" einschalten, andernfalls erscheint das Folding-Ribbon nicht.

Auch Codeblocks wie beispielsweise For-Loops lassen sich nun einklappen, hier noch ausgeklappt …
Vergrößern Auch Codeblocks wie beispielsweise For-Loops lassen sich nun einklappen, hier noch ausgeklappt …
… hier dieselbe Loop eingeklappt. Man steuert das Ein- und Ausklappen über das Folding-Ribbon am linken Rand.
Vergrößern … hier dieselbe Loop eingeklappt. Man steuert das Ein- und Ausklappen über das Folding-Ribbon am linken Rand.

Prima ist auch die verbesserte Anbindung an Source-Control-Dienste wie beispielsweise Github. Man kann nun direkt im Editor erkennen, welche Teile des Codes verändert wurden, noch nicht eingecheckt sind oder ob Konflikte bestehen. Dazu gibt es links neben den Zeilennummern farbige Balken. Selbst wenn man nur allein an einem Projekt arbeitet, ist die Funktion hilfreich, denn man sieht gleich auf den ersten Blick, wo man seit dem letzten Commit Änderungen im Code gemacht hat.

Multicursor Editing

Eine echte Innovation in Xcode 10 ist das Multi-Cursor-Editing. Hiermit kann man mehrere Textcursor gleichzeitig an verschiedenen Stellen im Text platzieren und die gleichen Änderungen simultan an allen Stellen gleichzeitig vornehmen. Hat man viele ähnliche Code-Stellen und muss überall die gleiche Änderung vornehmen, erspart einem das enorm viel Arbeit!

Das ist ein mächtiges neues Feature: Mit gedrückter ctrl- und Umschalttaste kann man mehrere Text-Cursor im Editor platzieren und anschließend an allen Stellen die selben Änderungen vornehmen.
Vergrößern Das ist ein mächtiges neues Feature: Mit gedrückter ctrl- und Umschalttaste kann man mehrere Text-Cursor im Editor platzieren und anschließend an allen Stellen die selben Änderungen vornehmen.

Fazit

Swift und Xcode entwickeln sich weiter, Apple verbessert die Sprache und das Entwicklerwerkzeug in kleinen aber stetigen Schritten, und es macht richtig Spaß, als Entwickler dabei mitzugehen. Schade nur, dass wir auf Swift 5 noch bis Anfang 2019 warten müssen.

Macwelt Marktplatz

0 Kommentare zu diesem Artikel
2354999