LeseprobeDieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps. In dieser Lese-probe machen Sie sich mit den Operatoren von Swift vertraut und lernen die iOS-Entwicklung anhand eines Hello-World-Programms kennen. Außerdem stellt Ihnen Michael Kofler seine Swift-Version des Spieleklassikers »Breakout« vor.
Michael Kofler
Swift 4 – Das umfassende Handbuch
1.304 Seiten, gebunden, Oktober 2017 49,90 Euro, ISBN 978-3-8362-5920-0
www.rheinwerk-verlag.de/4494
»Vorwort« »Operatoren« »Hello iOS-World!« »Breakout«
Inhaltsverzeichnis
Index
Der Autor
Leseprobe weiterempfehlen
Wissen, wie’s geht.
�
�
“buch” — 2017/10/6 — 8:49 — page 15 — #11
�
�
�
�
�
�
Vorwort
Apples größte Innovation des Jahres 2014 war aus meiner Sicht weder die Vorstellung der
Apple Watch noch die Auslieferung des Bestsellers iPhone 6. Apple hat sich neben den Arbei-
ten an diesen Produkten einer anderen Baustelle zugewandt und als Reaktion auf die vielen
Mängel, die die rund 20 Jahre alte Programmiersprache Objective-C aufweist, eine vollkom-
men neue Programmiersprache entwickelt: Swift!
In ersten Kommentaren konnten selbst Apple-Fans ihre Skepsis nicht verbergen: Brauchen
wir wirklich eine neue Programmiersprache? Doch jemehr Details Apple auf der WorldWide
Developers Conference (WWDC 2014) verriet, desto größer wurde die Begeisterung der teil-
nehmenden Entwickler und der Fachpresse.
Warum Swift?
Swift ist für Apple ein Befreiungsschlag: Objective-C dient dem Apple-Universum seit vielen
Jahren als Fundament. Das ändert aber nichts daran, dass Objective-C eine Programmierspra-
che aus den 1980er-Jahren ist, die in keinerlei Hinsichtmitmodernen Programmiersprachen
mithalten kann.
Swift ist dagegen ein sauberer Neuanfang. Bei der Vorstellung wurde Swift auch Objective-
C without the C genannt. Natürlich ist Swift von Objective-C beeinflusst – schließlich muss
Swift kompatibel zu denunzähligen Apple-Bibliotheken sein. Swift realisiert viele neue Ideen,
greift aber auch Konzepte von C#, Haskell, Java, Python und anderen Programmiersprachen
auf. Daraus ergeben sichmehrere Vorteile:
Swift zählt zu denmodernsten Programmiersprachen, die es momentan gibt.
Code lässt sich in Swift syntaktisch eleganter formulieren als in Objective-C.
Der resultierende Code ist besser lesbar und wartbar.
Swift ist für Programmierer, die schon Erfahrungmit anderenmodernen Sprachen gesam-
melt haben, wesentlich leichter zu erlernen als Objective-C. Vorhandenes Know-how lässt
sich einfacher auf Swift als auf Objective-C übertragen.
Swift ist ein Open-Source-Produkt und steht auch für Linux zur Verfügung. Der Entwick-
lungsprozess erfolgt offen und transparent.
Swift ist in den letzten Jahren kometenhaft in die Top-Listen der populärsten Programmier-
sprachen aufgestiegen. Im TIOBE-Index war Swift zuletzt auf Platz 11 vertreten.
15
�
�
“buch” — 2017/10/6 — 8:49 — page 16 — #12
�
�
�
�
�
�
Vorwort
Neu in Swift 4
Langjährige Swift-Entwickler haben Swift 3 in schlechter Erinnerung: Unzählige inkompati-
ble Neuerungen erforderten umfassende Änderungen an vorhandenem Code. Wesentlich
besser sieht es bei Swift 4 aus: Ein Großteil der Neuerungen sind Erweiterungen, die keine
Inkompatibilitäten verursachen. Und da, wo doch Code-Änderungen erforderlich sind, küm-
mert sich in der Regel der Code-Konverter von Xcode um die Anpassungen. Kurzum: Die
Anpassung von Swift-3-Code an Swift 4 sollte keine großen Probleme verursachen. Ärger
lauert allerdings an anderer Stelle: Veränderte Frameworks und APIs sowie Methoden und
Klassen, die plötzlich als deprecated gelten, zwingen in manchen Apps zu größeren Umbau-
ten. Das wiederum ist aber nicht die Schuld von Swift.
Was sind nun die wichtigsten Verbesserungen in Swift 4?
Zeichenketten: Der Umgang mit Zeichenketten ist ein wenig komfortabler geworden:
Zum einen lassen sich jetzt sehr elegant mehrzeilige Zeichenketten formulieren, zum
anderen ist die ständige Nennung der Eigenschaft überflüssig, um auf die Sequenz der
Zeichen einer Zeichenkette zuzugreifen. Die neue Substring-Struktur macht die Verarbei-
tung von Teilzeichenketten effizienter. Weitere Optimierungen wurden im Hintergrund
vorgenommen.
Bereiche (Ranges): Bereiche können nun zur einen oder anderen Seite offen formuliert
werden, also in der Form ar[3...] (alle Array-Elemente ab dem vierten) oder s[..<endpos]
(die Teilzeichenkette vom Beginn von s bis zur Position endpos).
Generics:Die Syntax zur Formulierung generischer Ausdrücke wurde an einigen Punkten
erweitert und gibt nunmehr Spielraum als bisher.
JSON-Support: Die Swift-Standardbibliothek wurde um das Protokoll Codable sowie um
diverse verwandte Protokolle und Klassen erweitert. Sie machen esmöglich, eigene Daten-
typen mit minimalem Aufwand im JSON-Format zu speichern bzw. aus JSON-Dateien
wieder einzulesen.
Xcode: Der Code-Editor von Xcode wurde komplett neu implementiert. Das merkt man
an der höheren Geschwindigkeit, an diversen Instabilitäten, vor allem aber daran, dass es
nun endlich Refactoring-Kommandos gibt. Hurra!
Keine Angst vor Swift 5!
Für mich als Autor ist es jedes Jahr ein wenig befremdlich: Ich arbeite mit voller Energie
an der Fertigstellung meines Buchs zu Swift 4, da diskutieren die Entwickler bereits über
Swift 5! Diese Version soll noch mehr Optimierungen beim Umgang mit Zeichenketten
bringen, weitere Generics-Features sowie ein Fundament für asynchrone Programmierkon-
strukte. (Deren vollständige Implementierung ist allerdings erst für Swift 6 geplant.)
Generell ist geplant, inkompatible Änderungen auf ein absolutes Minimum zu beschränken.
Swiftwird also erweitert, aber kaummehr geändert. Insofernmüssen Sie sichnicht vor Swift 5
16
�
�
“buch” — 2017/10/6 — 8:49 — page 17 — #13
�
�
�
�
�
�
Vorwort
fürchten: Soweit es wirklich Änderungen gibt, wird der in Xcode integrierte Code-Konverter
in bewährter Manier einen Großteil der Änderungen automatisch durchführen.
Außerdem hat sich bei meiner Arbeit an den drei Auflagen dieses Buchs eines heraus-
kristallisiert: Bei der App-Programmierung kostet nicht der Umgang mit Swift an sich Zeit,
sondern die Suche nach den geeigneten Klassen, Methoden und Programmiertechniken.
Was bietet dieses Buch?
Dieses Buch vermittelt einen kompakten Einstieg in die Programmiersprache Swift in der
Version 4 (Xcode 9). Das Buch ist in vier Teile gegliedert:
Teil I führt in die Grundlagen von Swift ein. Hier lernen Sie alle wichtigen Sprachdetails
kennen. Die Themenpalette reicht vom Umgang mit Variablen und elementaren Daten-
typen bis hin zur Syntax der objekt- und protokollorientierten Programmierung.
Teil II ist eine Einführung in die Entwicklung von Apps für iOS, macOS und tvOS. Hier
erkläre ich Ihnen beispielsweise, wie der Storyboard-Editor funktioniert, wie Sie Ihre
Oberflächemit eigenem Swift-Code verbinden, eigene ViewController-Klassen entwickeln,
Apps mit mehreren Dialogen/Views organisieren etc.
Teil III fasst wichtige Programmiertechniken in Bausteinform zusammen. In Kurzanlei-
tungen zeige ich Ihnen unter anderem, wie Sie auf Dateien zugreifen, XML-Dokumente
auswerten, Webseiten anzeigen, Steuerelemente mit eigener Grafik gestalten, Listen und
Tabellen in Apps darstellen, geografische Daten auswerten und Spiele mit SpriteKit pro-
grammieren. Sobald Ihre App zufriedenstellend funktioniert, lernen Sie, wie Sie sie taug-
lich für den App Store machen und dort einreichen.
Teil IV zeigt anhand konkreter Beispielprojekte die Praxis der App-Programmierung. Die
Apps decken eine ganze Palette von Themen ab: vom praktischen Währungsumrechner
über den Icon-Resizer bis hin zumehreren Spielen.
Neu in dieser Auflage sind nicht nur Swift-4-Features. Weitere inhaltliche Schwerpunkte sind
Drag&Drop für iOS, die iCloud-Programmierung sowie Server-side Swift.
Selbstverständlich können Sie alle Beispieldateien und -projekte dieses Buchs herunterladen.
Einen Download-Link finden Sie hier:
www.rheinwerk-verlag.de/4494
Um von diesem Buch maximal zu profitieren, benötigen Sie weder Vorkenntnisse in Xcode
noch in der App-Entwicklung. Ich setze aber voraus, dass Sie bereits Erfahrungen mit einer
beliebigen Programmiersprache gesammelt haben. Ich erkläre Ihnen in diesem Buch also,
wie Sie in Swift mit Variablen umgehen, Schleifen programmieren und Klassen entwickeln,
aber nicht, wasVariablen sind, wozu Schleifen dienenundwarumKlassendas Fundament der
objektorientiertenProgrammierung sind. So kann ich Swift kompakt undohne viel Overhead
beschreiben und den Schwerpunkt auf die konkrete Anwendung legen.
17
�
�
“buch” — 2017/10/6 — 8:49 — page 18 — #14
�
�
�
�
�
�
Vorwort
Leseanleitung
1300 Seiten – das kann schon abschrecken! Dazu besteht aber kein Grund. Ich habe mich
beim Schreiben dieses Buchs bemüht, den Inhalt auf möglichst eigenständige Kapitel zu ver-
teilen, aus denen Sie sich wie aus einem Baukasten bedienen können.
Wenn Swift für Sie vollständig neu ist, dann ist die Lektüre der ersten Kapitel aus Teil I natür-
lich unumgänglich. Besonders wichtig ist, dass Sie die Swift-spezifischen Eigenheiten beim
Umgang mit elementaren Datentypen und Aufzählungen (Arrays, Dictionaries etc.) kennen-
lernen und das Konzept von Optionals verstehen. Interessanterweise hat sich herausgestellt,
dass Sie für die Entwicklung erster Apps nicht unbedingt alle Feinheiten im Zusammenhang
mit Vererbung, Protokollen etc. beherrschenmüssen. Die Basics reichen zumeist.
Teil II richtet sich speziell an Programmierer, die erstmalig Apps für iOS, macOS oder tvOS
entwickeln.Wenn Sie bisher Objective-C zur App-Programmierung verwendet haben, werden
Sie in Teil II auf viel bekanntes Wissen stoßen.
Bei Teil III habe ich versucht, oft benötigte Programmiertechniken möglichst losgelöst von
der Zielplattform zu beschreiben. Beispielsweise erfolgt der Umgang mit Dateien unter iOS
ganz ähnlich wie untermacOS. Aus den Kapiteln in Teil III können Sie sich also bedienen, wie
Sie es gerade brauchen.
Viele Detailprobleme treten erst dann auf, wennman den Schritt von kleinen Beispielen hin
zu »richtigen«Appsmacht. Deswegen stellt Teil IV eineReihe vollständiger Projekte vor. Auch
wenn es unwahrscheinlich ist, dass Sie genau so eine App programmierenmöchtenwie eines
der Beispiele aus Teil IV, so werden Sie in diesen Kapiteln vermutlich doch inhaltlich ver-
wandte Anleitungen und Arbeitstechniken mit einem hohen Praxisbezug finden. Probieren
Sie die Apps einfach einmal aus, und blättern Sie dann durch die entsprechenden Kapitel –
Sie werden sicher über Details stolpern, die sich später als hilfreich herausstellen werden.
Viel Spaß bei der App-Entwicklung!
Eine neue Programmiersprache zu erlernen ist immer eine Herausforderung. Noch schwie-
riger ist es, einen Überblick über die schier unüberschaubare Fülle von Bibliotheken zu
gewinnen, die Sie zur App-Entwicklung brauchen. Dieses Buch soll Ihnen bei beiden Aspek-
ten helfen und Ihnen ein solides Fundament vermitteln.
Wenn Sie in die App-Entwicklung mit Swift einsteigen, haben Sie das Privileg, mit einer der
modernsten aktuell verfügbaren Programmiersprachen zu arbeiten. Sobald Sie die ersten
Schritte einmal erfolgreich absolviert haben, wird die Faszination für diese Sprache auch
Sie erfassen. Bei Ihrer Reise durch die neue Welt von Swift wünsche ich Ihnen viel Spaß und
Erfolg!
Michael Kofler (https://kofler.info)
PS: Vielen Dank an Alfred Schilken für sein Feedback zumManuskript!
18
�
�
“buch” — 2017/10/6 — 8:49 — page 71 — #67
�
�
�
�
�
�
3
Kapitel 3
Operatoren
Im Ausdruck a = b + c gelten die Zeichen = und + als Operatoren. Dieses Kapitel stellt Ihnen
alle Swift-Operatoren vor – von den simplenOperatoren für die Grundrechenarten bis hin zu
Swift-Spezialitäten wie dem Range-Operator n1...n2.
Leerzeichen vor oder nach Operatoren
Normalerweise ist es nicht notwendig, vor oder nach einem Operator ein Leerzeichen zu
schreiben. x=x+7 funktioniert genauso gut wie x = x + 7. Aber wie so oft bestätigen Aus-
nahmen die Regel: Swift kennt bereits standardmäßig ungewöhnlich viele Operatoren, und
wenige Zeilen Code reichen aus, umweitere zu definieren.
Das führt mitunter dazu, dass der Compiler nicht eindeutig erkennen kann, wo der eine Ope-
rator endet und wo der nächste beginnt. Spätestens dannmüssen Sie ein Leerzeichen setzen
– und dann sollten Sie es vor und nach dem Operator setzen! Andernfalls glaubt der Com-
piler nämlich, Sie wollten ihn explizit darauf hinweisen, dass es sich um einen Präfix- oder
Postfix-Operator handelt. Im Detail sind diese Feinheiten in »The Swift Programming Lan-
guage« beim Punkt »Operators« dokumentiert:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/
Swift_Programming_Language/LexicalStructure.html
Wie rasch Probleme auftreten können, zeigt der Vergleich eines Optionals mit nil: DerCompiler betrachtet if opt!=nil als Syntaxfehler, weil er die Anweisung im Sinne von ifopt! = nil interpretiert, also als Kombination zweier Operatoren. Korrekt müssen Sie den
Vergleich in der Form if opt != nil formulieren.
3.1 Zuweisungs- und Rechenoperatoren
Dieser Abschnitt erläutert die zahlreichen Rechen- und Zuweisungsoperatoren. Swift kennt
dabei auchMischformen. Beispielsweise entspricht x+=3 der Anweisung x=x+3.
71
�
�
“buch” — 2017/10/6 — 8:49 — page 72 — #68
�
�
�
�
�
�
3 Operatoren
Einfache Zuweisung
Der Zuweisungsoperator = speichert in einer Variablen oder Konstanten das Ergebnis des Aus-
drucks:
variable = ausdruck
Vor der ersten Zuweisung an eine Variable bzw. Konstante muss diese mit var bzw. let als
solche deklariert werden:
var i = 17i = i * 2let pi = 3.1415927
Nicht zulässig sindMehrfachzuweisungen in der Art a=b=3. Dafür könnenmehrere Variablen
als Tupel geschrieben und gleichzeitig verändert werden:
let (a, b, c) = (1, 7, 12)
Das funktioniert auch bei komplexeren Ausdrücken:
let (_, a, (b, c)) = (1, 2, ("x" , "y"))// entspricht var a=2; var b="x"; var c="y"
Der Unterstrich _ ist hier einWildcard Pattern. Es trifft auf jeden Ausdruck zu und verhindert
im obigen Beispiel dessen weitere Verarbeitung.
Wert- versus Referenztypen
Swift unterscheidet bei Zuweisungen zwischen zwei grundlegenden Datentypen:
Werttypen (Value Types): Dazu zählen Zahlen, Zeichenketten, Tupel, Arrays, Dictiona-
ries sowie struct- und enum-Daten. Bei einer Zuweisung werden die Daten kopiert. Die
ursprünglichen Daten und die Kopie sind vollkommen unabhängig voneinander.
Referenztypen: Objekte, also Instanzen von Klassen, sind Referenztypen. Bei einer Zuwei-
sung wird eine weitere Referenz auf die bereits vorhandenen Daten erstellt. Es zeigen nun
zwei (odermehr) Variablen auf dieselben Daten.
Die folgenden beiden Beispiele verdeutlichen den Unterschied. Im ersten Beispiel werden in
x und y ganze Zahlen gespeichert, alsoWerttypen:
var x = 3var y = xx=4print(y) // y ist unverändert 3
Für das zweite Beispiel definieren wir zuerst die Mini-Klasse SimpleClass. In a wird eine
Instanz dieser Klasse gespeichert. Bei der Zuweisung b = a wird die Instanz nicht kopiert,
stattdessen verweist nun b auf dasselbe Objekt wie a. (In C würde man sagen, a und b sind
Zeiger.) Jede Veränderung des Objekts betrifft deswegen a gleichermaßen wie b:
72
�
�
“buch” — 2017/10/6 — 8:49 — page 73 — #69
�
�
�
�
�
�
3
3.1 Zuweisungs- und Rechenoperatoren
class SimpleClass {var data=0
}
var a = SimpleClass ()var b = a // a und b zeigen auf die gleichen Datena.data = 17print(b.data) // deswegen ist auch b.data 17
Arrays, Dictionaries und Zeichenketten sind Werttypen!
Die Unterscheidung zwischen Wert- und Referenztypen gibt es bei den meisten Program-
miersprachen. Beachten Sie aber, dass Arrays und Zeichenketten in Swift Werttypen sind und
nicht, wie in vielen anderen Sprachen, Referenztypen!
Elementare Rechenoperatoren
Diemeisten Rechenoperatoren sind aus dem täglichen Leben bekannt (siehe Tabelle 3.1). Der
Operator % liefert den Rest einer ganzzahligen Division: 13 % 5 ergibt also 3, da 2 * 5 + 3
= 13. Bei Fließkommazahlen wird der Rest zum ganzzahligen Ergebnis ermittelt. 1.0 % 0.4
ergibt 0.2, da 2 * 0.4 + 0.2 = 1.0 ist.
Operator Bedeutung
+ Addition
- Subtraktion
* Multiplikation
/ Division
% Restwert einer ganzzahligen Division
&+ Integer-Addition ohne Überlaufkontrolle
&- Integer-Subtraktion ohne Überlaufkontrolle
&* Integer-Multiplikation ohne Überlaufkontrolle
Tabelle 3.1 Rechenoperatoren
Alle Operatoren setzen voraus, dass links und rechts von ihnen jeweils gleichartige Daten-
typen verwendet werden! Im Gegensatz zu anderen Programmiersprachen erfolgen Typum-
wandlungen nicht automatisch.
73
�
�
“buch” — 2017/10/6 — 8:49 — page 74 — #70
�
�
�
�
�
�
3 Operatoren
var a = 3 // a ist eine Integer -Variablevar b = 1.7 // b ist eine Fließkommavariablevar c = a + b // Fehler , Int -Wert + Double -Wert nicht zulässig
Wenn Sie die Summe von a plus b ausrechnen möchten, müssen Sie explizit den Datentyp
einer der beiden Operatoren anpassen. Int rundet dabei immer ab, d. h., aus 1.7 wird 1.
var c1 = a + Int(b) // c1 = 4var c2 = Double (a) + b // c2 = 4.7
Division durch null
Bei einer Fließkommadivision durch 0.0 lautet das Ergebnis einfach Double.infinity bzw.
-Double.infinity. Wenn Sie hingegen mit Integerzahlen arbeiten, löst eine Division durch
0 einen Fehler aus.
Eine Besonderheit von Swift sind die Operatoren &+, &- und &*: Sie führen die Grundrechen-
arten für Integerzahlen ohne Überlaufkontrolle durch. Das ermöglicht die Programmierung
besonders effizienter Algorithmen. Sollte allerdings doch ein Überlauf eintreten, dann ist das
Ergebnis falsch!
var i = 10000000 // Integervar result = i &* i &* i // falsches Ergebnis
// 3.875.820.019.684.212.736
Swift kennt keinen Operator zum Potenzieren. a
b
müssen Sie unter Zuhilfenahme der Funk-
tion pow berechnen. Diese Funktion ist in der Foundation-Bibliothek definiert. Sie steht nur
zur Verfügung, wenn Ihr Code import Foundation enthält oder eine andere Bibliothek impor-
tiert, die auf die Foundation zurückgreift. Das trifft unter anderem für Cocoa und UIKit zu.
var e = 7.0var f = pow(e, 3.0) // 7 * 7 * 7 = 343.0
Zeichenketten aneinanderfügen
Der Operator + addiert nicht nur zwei Zahlen, sondern fügt auch Zeichenketten aneinander:
var s1 = "Hello "var s2 = "World !"var hw = s1 + " " + s2 // "Hello World!"
Inkrement und Dekrement
Wie viele andere Programmiersprachen kannte Swift bis zur Version 2 die Inkrement- und
Dekrement-Operatoren ++ und --. In Swift 3 wurden diese Operatoren allerdings eliminiert,
74
�
�
“buch” — 2017/10/6 — 8:49 — page 75 — #71
�
�
�
�
�
�
3
3.1 Zuweisungs- und Rechenoperatoren
mit der Begründung, dass die Unterscheidung zwischen der Postfix- und der Präfix-Notation,
also zwischen i++ und ++i, zu viel Verwirrung und oft fehlerhafte Algorithmen verursacht.
Wenn Sie in Swift eine Variable um eins vergrößern oder verkleinern möchten, müssen Sie
dies in der Form i=i+1 oder in der Kurzschreibweise i+=1machen.
var i=3i++ // Fehler , steht ab Swift 3 nicht mehr zur Verfügungi+=1 // OK
Inkrement- und Dekrement-Operatoren selbst gemacht
Wenn Sie auf die Inkrement- und Dekrement-Operatoren nicht verzichten möchten, bietet
Swift die Möglichkeit, diese Operatoren relativ unkompliziert wieder selbst zu definieren.
Fertigen Code für alle Integer-Datentypen inklusive Int8, Int16, Int32 und Int64 sowie alleUInt-Varianten finden Sie z. B. hier auf GitHub:
https://gist.github.com/erica/6b4be87de789f32b8926388c6c6e75e9
Rechnen mit Bits
Die bitweisen Operatoren &, |, ^ und ~ (AND, OR, XOR und NOT) verarbeiten ganze Zahlen
bitweise. Das folgende Beispiel verwendet die Schreibweise 0b zur Kennzeichnung binärer
Zahlen. String mit dem zusätzlichen Parameter radix:2 wandelt ganze Zahlen in eine Zei-
chenkette in binärer Darstellung um.
let a = 0b11100 // Wert 28let b = 0b01111 // Wert 15let result = a & b // Wert 12print(String (result , radix:2)) // Ausgabe 1100
>> verschiebt die Bits einer Zahl um n Bits nach rechts (entspricht einer Division durch 2n), <<
verschiebt entsprechend nach links (entspricht einer Multiplikationmit 2
n). >>> funktioniert
wie >>, betrachtet die Zahl aber so, als wäre sie vorzeichenlos.
let e = 16let f = e << 2 // entspricht f=e*4, Ergebnis 64let g = e >> 1 // entspricht g=e/2, Ergebnis 8
Wenn Sie Daten bitweise verarbeiten, ist es oft zweckmäßig, anstelle gewöhnlicher Integer-
Zahlen explizit Datentypen ohne Vorzeichen zu verwenden, z. B. UInt32 oder UInt16. Das
folgende Beispiel verwendet 0x zur Kennzeichnung hexadezimaler Zahlen:
let rgb: UInt32 = 0x336688let red: UInt8 = UInt8( (rgb & 0xff0000 ) >> 16 )
75
�
�
“buch” — 2017/10/6 — 8:49 — page 76 — #72
�
�
�
�
�
�
3 Operatoren
Kombinierte Rechen- und Zuweisungsoperationen
Alle bereits erwähnten Rechenoperatoren sowie die logischen Operatoren && und || können
mit einer Zuweisung kombiniert werden. Dazu muss dem Operator das Zeichen = folgen.
Details zu den logischen Operatoren folgen im nächsten Abschnitt.
x += y // entspricht x = x + yx -= y // entspricht x = x - yx *= y // entspricht x = x * yx /= y // entspricht x = x / yx %= y // entspricht x = x % yx <<= y // entspricht x = x << yx >>= y // entspricht x = x >> yx &= y // entspricht x = x & yx &&= y // entspricht x = x && yx |= y // entspricht x = x | yx ||= y // entspricht x = x || yx ^= y // entspricht x = x ^ y
3.2 Vergleichsoperatorenund logischeOperatoren
Um Bedingungen für Schleifen oder Verzweigungen zu formulieren, müssen Sie Variablen
vergleichen und oft mehrere Vergleiche miteinander kombinieren. Dieser Abschnitt stellt
Ihnen die dazu erforderlichen Operatoren vor.
Vergleichsoperatoren
Die Vergleichsoperatoren ==, != (ungleich), <, <= sowie > und >= können gleichermaßen für
Zahlen und für Zeichenketten eingesetzt werden. Wie bei anderen Operatoren ist es wichtig,
dass auf beiden Seiten des Operators der gleiche Datentyp verwendet wird; Sie können also
nicht eine ganze Zahl mit einer Fließkommazahl vergleichen!
1 == 2 // false1 < 2 // true
"abc" == "abc" // true"abc" == "Abc" // false
Zeichenketten gelten dann als gleich, wenn auch die Groß- und Kleinschreibung überein-
stimmt. Etwas schwieriger ist die Interpretation von größer und kleiner. Grundsätzlich gelten
Großbuchstaben als kleiner als Kleinbuchstaben, d. h., sie werden beim Sortieren vorne ein-
gereiht. Internationale Zeichen werden auf der Basis der Unicode-Normalform D verglichen.
Die deutschen Buchstaben ä, ö oder ü werden dabei wie eine Kombination aus zwei Zeichen
betrachtet, beispielsweise ä = a". Somit gilt:
76
�
�
“buch” — 2017/10/6 — 8:49 — page 77 — #73
�
�
�
�
�
�
3
3.2 Vergleichsoperatoren und logische Operatoren
"A" < "a" // true"a" < "ä" // true"ä" < "b" // true
Mehr Details zur Sortierordnung von Zeichenketten und zu Ihren Möglichkeiten, diese zu
beeinflussen, folgen in Kapitel 8, »Zeichenketten«.
== versus ===
Zum Vergleich von Objekten kennt Swift neben == und != auch die Varianten === und !==.
Dabei testet a===b, ob die beiden Variablen a und b auf dieselbe Instanz einer Klasse zeigen.
Hingegen überprüft a==b, ob a und b zwei Objekte mit übereinstimmenden Daten sind. Das
ist nicht das Gleiche! Es ist ja durchausmöglich, dass zwei unterschiedlicheObjekte dieselben
Daten enthalten.
Einschränkungen
Die Operatoren === und !== können nur auf Referenztypen angewendet werden, nicht auf
Werttypen (wie Zahlen, Zeichenketten, Arrays, Dictionaries sowie sonstige Strukturen).
Umgekehrt können die Operatoren == und != bei selbst definierten Klassen nur verwen-
det werden, wenn Sie für diese Klassen den Operator == selbst implementieren (Protokoll
Equatable, siehe Abschnitt 12.4, »Standardprotokolle«).
Die folgenden Zeilen definieren zuerst die Klasse Pt zur Speicherung eines Koordinaten-
punkts und dann den Operator == zum Vergleich zweier Pt-Objekte. Damit ist das Beispiel
gleich auch ein Vorgriff auf die Definition eigener Operatoren.
class Pt {var x: Double , y: Double// Init -Funktioninit(x: Double , y: Double ){
self.x=xself.y=y
}}// Operator zum Vergleich von zwei Pt-Objektenfunc ==(left: Pt, right: Pt) -> Bool {
return left.x == right.x && left.y == right.y}
// == versus ===var p1 = Pt(x: 1.0 , y: 2.0)var p2 = Pt(x: 1.0 , y: 2.0)p1 == p2 // true , weil die Objekte dieselben Daten enthaltenp1 === p2 // false , weil es unterschiedliche Objekte sind
77
�
�
“buch” — 2017/10/6 — 8:49 — page 78 — #74
�
�
�
�
�
�
3 Operatoren
Vergleiche mit ~=
Swift kennt mit ~= einen weiteren Vergleichsoperatormit recht wenigen Funktionen:
Zwei Ausdrücke des gleichen Typs werden wiemit == verglichen.
Außerdem kann getestet werden, ob eine ganze Zahl in einem durch den Range-Operator
formulierten Zahlenbereich enthalten ist.
-2...2 ~= 1 // true-2...2 ~= -2 // true-2...2 ~= 2 // true-2...2 ~= 4 // false
Achten Sie darauf, dass Sie zuerst den Bereich und dann den Vergleichswert angeben müs-
sen. Wenn Sie die Reihenfolge vertauschen, funktioniert der Operator nicht. Details zu
Range-Operatoren folgen gleich in Abschnitt 3.3.
Analog kann auch in switch-Ausdrückenmit case überprüft werden, ob sich ein ganzzahliger
Ausdruck in einem vorgegebenen Bereich befindet:
let n = 12switch n {case (1...10) :
print("Zahl zwischen 1 und 10")
case(11...20) :print("Zahl zwischen 11 und 20")
default :print("Andere Zahl")
}
Datentyp-Vergleich (»is«)
Mit demOperator is testen Sie, ob eine Variable einem bestimmten Typ entspricht:
func f(obj: Any) {if obj is UInt32 {
print ("Datentyp UInt32 ")...
}}
Casting-Operator (»as«)
Mit demOperator aswandeln Sie, sofernmöglich, einen Datentyp in einen anderen um. Der
Operator hat in Swift drei Erscheinungsformen:
78
�
�
“buch” — 2017/10/6 — 8:49 — page 79 — #75
�
�
�
�
�
�
3
3.2 Vergleichsoperatoren und logische Operatoren
as: In dieser Formeignet sich asnur, wenn der Compiler erkennen kann, dass die Umwand-
lung gefahrlos möglich ist. Das trifft auf alle Upcasts zu, also auf Umwandlungen in
Instanzen einer übergeordneten Klasse (siehe Abschnitt 12.1, »Vererbung«), außerdem bei
manchen Literalen (z. B. 12 as Float).
as?: Der Downcast-Operator as? typ stellt vor der Typkonvertierung sicher, dass diese
überhaupt möglich ist. Wenn das nicht der Fall ist, lautet das Ergebnis nil. Es tritt kein
Fehler auf.
Mit if let varname = ausdruck as? typ können Sie den Typtestmit einer Zuweisung kom-
binieren. Das funktioniert gleichermaßen für Konstanten (let wie im folgenden Beispiel)
wie auch für Variablen (var):
func f(obj: Any) {if let myint = obj as? UInt32 {
// myint hat den Datentyp UInt32...
} else {print("falscher Datentyp ")
}}
as!: Mit einem nachgestellten Ausrufezeichen wird die Konvertierung auf jeden Fall ver-
sucht. Dabei kann es zu einem Fehler kommen, wenn der Datentyp nicht passt. Insofern
ist diese Variante zumeist nur zweckmäßig, wenn die Typüberprüfung im Voraus erfolgt.
let obj: Any = 123if obj is UInt32 {
// wird nicht ausgef ührt, weil obj eine Int-Instanz enthältvar myint = obj as! UInt32
}
Upcasts und Downcasts
Ein Grundprinzip der objektorientierten Programmierung ist die Vererbung. Damit können
KlassendieMerkmale einer Basisklasseübernehmen und diese erweitern oder verändern. Ein
Objekt einer abgeleiteten Klasse (imKlassendiagrammunten dargestellt) kann immerwie ein
Objekt der Basisklasseverwendet werden (im Klassendiagrammoben). Das nenntman einen
(impliziten) Upcast, also eine Umwandlung in der Klassenhierarchie nach oben.
Eine Konvertierung in die umgekehrte Richtung ist ein Downcast. Dieser funktioniert nur,
wenn eine Variable vom Typ der Basisklasse tatsächlich ein Objekt der erforderlichen ab-
geleiteten Klasse enthält. Mehr Details zu diesem Thema finden Sie in Abschnitt 12.1, »Ver-
erbung«.
79
�
�
“buch” — 2017/10/6 — 8:49 — page 80 — #76
�
�
�
�
�
�
3 Operatoren
Logische Operatoren
Logische Operatoren kombinieren Wahrheitswerte. Wahr UND Wahr liefert wieder Wahr;
Wahr UND Falsch ergibt hingegen Falsch. In Swift gibt es wie in den meisten anderen Pro-
grammiersprachen die drei logischen Operatoren ! (Nicht), && (Und) sowie || (Oder):
let a=3, b=5a>0 && b<=10 // truea>b || b>a // truelet ok = (a>b) // falseif !ok { // wenn ok nicht true ist , dann ...
print("Fehler ") // ... eine Fehlermeldung ausgeben}
&& und || führen eine sogenannte Short-Circuit Evaluation aus: Steht nach der Auswertung
des erstenOperanden das Endergebnis bereits fest, wird auf die Auswertung des zweiten Aus-
drucks verzichtet. Wenn im folgenden Beispiel a>b das Ergebnis false liefert, dann ruft Swift
die Funktion calculate gar nicht auf; der logische Ausdruck ist in jedem Fall false, ganz egal,
welches Ergebnis calculate liefern würde.
if a>b && calculate (a, b)==14 { ... }
3.3 Range-Operatoren
In Swift gibt es fünf Operatoren, um Zahlenbereiche auszudrücken (siehe Tabelle 3.2). Bei den
ersten beiden Variantenmuss n1 kleiner als n2 sein, sonst ist der Ausdruck ungültig.
Operator Interne Darstellung Bedeutung
n1...n2 CountableRange n1 bis inklusive n2 (1...3 entspricht 1, 2, 3)
n1..<n2 CountableClosedRange n1 bis exklusive n2 (1..<3 entspricht 1, 2)
...n2 PartialRangeThrough vom Anfang bis inklusive n2
..<n2 PartialRangeUpTo vom Anfang bis exklusive n2
n1... CountablePartialRangeFrom von n1 bis zum Ende
Tabelle 3.2 Range-Operatoren
Bei den in Swift 4 eingeführten einseitigen Bereichen hängt der Anfang oder das Ende davon
ab, worauf die Operatoren angewendet werden. Wenn der Bereich auf die Elemente eines
Arrays angewendet wird, dann beginnt ...n2 bzw. ..<n2mit demerstenArray-Element (Index
0). n1... endet mit dem letzten Array-Element. Analog funktioniert dies bei Zeichenketten,
80
�
�
“buch” — 2017/10/6 — 8:49 — page 81 — #77
�
�
�
�
�
�
3
3.3 Range-Operatoren
wobei hier anstelle der Zahlen n1 bzw. n2 Elemente der Struktur String.Index verwendet wer-
denmüssen.
Normalerweise werden diese Range-Operatoren für ganze Zahlen bzw. String-Positionen ver-
wendet. Es gibt aber auch Anwendungsfälle für Fließkommazahlen und Zeichenketten.
Intern sind die Range-Operatoren Kurzschreibweisen zur Erzeugung diverser XxxxRange-
Strukturen:
1.. <10 // entspricht CountableRange <Int >(1.. <10)1...10 // entspricht CountableClosedRange <Int >(1...10)
Bei beidseitig geschlossen Bereichen lauten die wichtigsten Eigenschaften startIndex und
endIndex. Sie geben den Start- bzw. Endwert des Bereichs an. contains überprüft, ob eine
bestimmte Zahl im Zahlenbereich enthalten ist:
var r1 = 1.. <10 // entspricht r = CountableRange <Int >(1.. <10)r1.startIndex // 1r1.endIndex // 10r1.contains (7) // truer1.contains (11) // false
Bei einseitigen Bereichen geben lowerBound bzw. upperBound die obere bzw. untere Grenze an:
let r2 = 17... // entspricht CountablePartialRangeFrom <Int>(17)r2.lowerBound // 17r2.contains (23) // true
Darüber hinaus gibt es unzählige Methoden, um den Zahlenbereich zu verändern (dropFirst,
dropLast, reversed) bzw. um seine Elemente zu verarbeiten (filter, forEach, map):
(1...5) .map { print($0 * 2) } // Ausgabe 2, 4, 6, 8, 10
Range-Operatoren in Schleifen
Mit den Range-Operatoren definierte Bereiche können in Schleifen verarbeitet werden:
for i in 1...10 {print(i) // Ausgabe 1, 2, ... , 10
}
Nach oben offene Bereiche sind ebenfalls als Basis für eine Schleife erlaubt – aber Vorsicht:
ohne break ergibt sich eine Endlosschleife!
for i in 10... {if i>20 {break}print(i) // Ausgabe 10, 11, ... , 20
}
Nach unten offene Bereiche sind in Schleifen nicht erlaubt.
81
�
�
“buch” — 2017/10/6 — 8:49 — page 82 — #78
�
�
�
�
�
�
3 Operatoren
Range-Operatoren und Arrays
In der folgenden Schreibweise können Sie Zahlenbereiche zur Initialisierung eines Integer-
Arrays verwenden:
var ar = [Int](1...10) // entspricht var ar = [1, 2, ... , 10]
Anstelle des üblichen Zugriffs auf ein Array-Element mit array[n] können Sie auch einen
Bereich für den Zugriff auf mehrere Elemente angeben. Die folgenden Beispiele zeigen die
Anwendung aller fünf Range-Operatoren. Beachten Sie, dass das Ergebnis kein neues Array
ist, sondern eine ArraySlice-Struktur. Beachten Sie auch, dass Array-Indizes immer mit 0
beginnen. array[0] ist also das erste Element, array[...2]meint daher alle Elemente bis zum
dritten. Mehr Informationen zumUmgangmit Arrays folgen in Kapitel 10, »Arrays, Dictiona-
ries, Sets und Tupel«.
let data = ["a", "b", "c", "d", "e"] // Datentyp Array <String >data[2...4] // ["c", "d", "e"], Datentyp ArraySlice <String >data[2.. <4] // ["c", "d"]data[3...] // ["d", "e"]data[...2] // ["a", "b", "c"]data[.. <2] // ["a", "b"]
Range-Operatoren in switch-Konstrukten
Mit dem vorhin schon vorgestellten Operator ~= können Sie testen, ob sich ein Wert inner-
halb eines Bereiches befindet:
1...10 ~= 8 // true...7 ~= 12 // false7... ~= 12 // true...7 ~= 7 // true.. <7 ~= 7 // false7... ~= 8 // true
Analog gilt diese Schreibweise auch in switch-Konstruktionen (siehe Abschnitt 5.3, »Verzwei-
gungen mit switch«):
let n = 21switch n {case .. <10:
print("kleiner als 10")case 10...20:
print("zwischen 10 und 20")case 21...:
print("größer als 20")default :
print("wird nie eintreten , aber syntaktisch erforderlich ")}
82
�
�
“buch” — 2017/10/6 — 8:49 — page 83 — #79
�
�
�
�
�
�
3
3.3 Range-Operatoren
Range-Operatoren für Fließkommazahlen
Als Vergleichsbasis für switch bzw. für den Operator ~= dürfen auch Fließkommabereiche
gebildet werden:
1.7.. <2.9 ~= 2.3 // true
Allerdings gelten für Bereiche, derenGrunddatentyp nicht aufzählbar ist, viele Einschränkun-
gen. Beispielsweise ist es unmöglich, Schleifen über sie zu bilden:
Schleifen über einen Fließkommazahlenbereich
Um analog zu for i in 1...3 eine Schleife für eine double-Variable zu formulieren, können
Sie auf stride zurückgreifen. Diese Funktion stelle ich Ihnen in Kapitel 5, »Verzweigungen
und Schleifen«, vor.
Range-Operatoren für Zeichenketten
Für Vergleiche mit einzelnen Zeichen bzw. in switch-Konstruktionen können Sie auch Zei-
chenbereiche verwenden. Wie bei Fließkommazahlen ist aber eine Anwendung in Schleifen
nicht zulässig.
"a"..."z" ~= "f" // true"0"..."9" ~= "x" // false
Als Start- und Endpunkt der Range-Operatoren sind auch String.Index-Elemente erlaubt.
s[startindex...endindex] liefert allerdings keine neue Zeichenkette, sondern einen Sub-
String:
let s = "Hello World!"if let startindex = s.index(of: " ") {
let part1 = s[.. <startindex ] // Datentyp String .SubSequence , das istlet part2 = s[startindex ...] // ein typealias für Substring
print(part1) // "Hello"print(part2) // " World!"
}
Beachten Sie, dass die Start- und Endpunkte des Bereichs unbedingt als String.Index-Ele-
mente formuliert werden müssen. Der in nahezu allen anderen Programmiersprachen
übliche Zugriff über ganze Zahlen ist in Swift nicht erlaubt (sieht auch Kapitel 8, »Zeichen-
ketten«).
83
�
�
“buch” — 2017/10/6 — 8:49 — page 84 — #80
�
�
�
�
�
�
3 Operatoren
3.4 Operatoren für Fortgeschrittene
Die wichtigstenOperatoren kennen Sie nun. Dieser Abschnitt ergänzt Ihr Wissen um Spezial-
und Hintergrundinformationen. Am interessantesten ist dabei sicherlich die Möglichkeit,
selbst eigene Operatoren zu definieren bzw. vorhandene Operatoren zu überschreiben (Ope-
rator Overloading).
Ternärer Operator
Swift kennt drei Typen von Operatoren:
Unäre Operatoren (Unary Operators) verarbeiten nur einen Operanden. In Swift zäh-
len dazu das positive und negative Vorzeichen, das logische NICHT (also !bool) und die
Unwrapping-Operatoren ! und ? zur Auswertung von Optionals (also opt! oder opt?).
Binäre Operatoren verarbeiten zwei Operanden, also etwa das a * b. Die Mehrheit der
Swift-Operatoren fällt in diese Gruppe.
Ternäre Operatoren verarbeiten drei Operanden. In Swift gibt es nur einen derartigen Ver-
treter, der daher einfach als der ternäre Operator bezeichnet wird – so, als wären andere
ternäre Operatoren undenkbar.
Die Syntax des ternären Operators sieht so aus:
a ? b : c
Wenn der boolesche Ausdruck a wahr ist, dann liefert der Ausdruck b, sonst c. Der ternäre
Operator eignet sich dazu, einfache if-Verzweigungen zu verkürzen:
// if-Schreibweiselet result :Stringlet x = 3if x<10 {
result = "x kleiner 10"} else {
result = "x größer-gleich 10"}
// verkürzte Schreibweise mit dem ternären Operatorlet x = 3let result = x<10 ? "x kleiner 10" : "x größer gleich 10"
Unwrapping- und Nil-Coalescing-Operator
Anders als in den meisten anderen Programmiersprachen können mit einem Typ dekla-
rierte Swift-Variablen nie den Zustand null im Sinne von »nicht initialisiert« annehmen.
Swift bietet dafür die Möglichkeit, eine Variable explizit als Optional zu deklarieren (siehe
84
�
�
“buch” — 2017/10/6 — 8:49 — page 85 — #81
�
�
�
�
�
�
3
3.4 Operatoren für Fortgeschrittene
Abschnitt 4.2, »Optionals«). Dazu geben Sie explizit den gewünschten Datentyp an, demwie-
derum ein Fragezeichen oder ein Ausrufezeichen folgt:
var x: Int? = 3 // x enthält eine ganze Zahl oder nilvar y: Int! = 4 // y enthält eine ganze Zahl oder nilvar z: Int = 5 // z enthält immer eine ganze Zahl
x = nil // oky = nil // okz = nil // nicht erlaubt
Der Unterschied zwischen x und y besteht darin, dass das Auspacken (Unwrapping) des
eigentlichen Werts bei y automatisch erfolgt, während es bei x durch ein nachgestelltes Aus-
rufezeichen – den Unwrapping-Operator – erzwungen werden muss. Beachten Sie, dass die
folgenden Zeilen beide einen Fehler verursachen, wenn x bzw. y den Zustand nil aufweist!
var i: Int = x! // explizites Unwrapping durch x!var j: Int = y // automatisches Unwrapping
Die Variablen x und y können also nil enthalten. nil hat eine ähnliche Bedeutung wie bei
anderen Sprachen null. Optionals sind aber gleichermaßen für Wert- und für Referenztypen
vorgesehen, was in manchen anderen Programmiersprachen nicht oder nur auf Umwegen
möglich ist. Allerdings können nur solche Klassen für Optionals verwendet werden, die das
Protokoll ExpressibleByNilLiteral einhalten.
Mit diesemVorwissen kommenwir nun zumNil-Coalescing-Operator a ?? b, der sich ebenso
schwer aussprechen wie übersetzen lässt. Bei ihm handelt es sich um eine Kurzschreibweise
des folgenden Ausdrucks:
a != nil ? a! : b
Wenn a initialisiert ist, also nicht nil ist, dann liefert a ?? b den Wert von a zurück,
andernfalls den Wert von b. Damit eignet sich b zur Angabe eines Defaultwerts. In
a! bewirkt das Ausrufezeichen das Auspacken (Unwrapping) des Optionals. Aus dem Optio-
nal Typ?wird also der reguläre Datentyp Typ.
// k den Wert von x oder den Defaultwert -1 zuweisenvar k = x ?? -1 // der Datentyp von k ist Int
Optional Chaining
Ebenfalls mit Optionals hat die Operatorkombination ?. zu tun. Sie testet, ob ein Ausdruck
nil ergibt. Ist dies der Fall, lautet das Endergebnis nil. Andernfalls wird das Ergebnis aus-
gepackt und der nächste Ausdruck angewendet. Wenn dieser ebenfalls ein Optional liefert,
kann auch diesem Ausdruck ein Fragezeichen hintangestellt werden. Swift führt einen wei-
85
�
�
“buch” — 2017/10/6 — 8:49 — page 86 — #82
�
�
�
�
�
�
3 Operatoren
teren nil-Test durch. Diese Verkettung von nil-Tests samt Auswertung, wenn der Ausdruck
nicht nil ist, heißt in Swift »Optional Chaining«:
let a = optional ?.method ()?.propertylet b = optional ?.method1 ()?.method2 ()?.method3 ()
Operator-Präferenz
Beim Ausdruck a + b * c rechnet Swift zuerst b*c aus, bevor es summiert – so wie Sie es in
der Schule gelernt haben. Generell gilt in Swift eine klare Hierarchie der Operatoren (siehe
Tabelle 3.3). Um die Verarbeitungsreihenfolge zu verändern, können Sie natürlich jederzeit
Klammern setzen – also beispielsweise (a+b)*c.
Priorität Operatoren
BitwiseShiftPrecedence << >>
MultiplicationPrecedence� * / % &*
AdditionPrecedence � + - &+ &- | ^
RangeFormationPrecedence ... ..<
CastingPrecedence is as
NilCoalescingPrecedence ??
ComparisonPrecedence < <= > >= == != === !=== ~=
LogicalConjunctionPrecedence� &&
LogicalDisjunctionPrecedence� ||
DefaultPrecedence (keine zugeordneten Operatoren)
TernaryPrecedence � ?:
AssignmentPrecedence � = *= /= %= += -= <<= >>= &= ^= |= &&= ||=
FunctionArrowPrecedence� ->
Tabelle 3.3 Hierarchie der binären Operatoren
In Swift gibt es vordefinierte Prioritätsgruppen (Precedence Groups). Die erste Spalte der
Operatorentabelle gibt neben dem Namen der Gruppe auch die Assoziativität an (soweit
definiert). Diese bestimmt, ob gleichwertige Operatoren von links nach rechts oder von
rechts nach links verarbeitet werden sollen. Beispielsweise ist - (Minus) ein linksassoziati-
ver Operator. Die Auswertung erfolgt von links nach rechts. 17 - 5 - 3wird also in der Form
(17 - 5)- 3 verarbeitet und ergibt 9. Falsch wäre 17 - (5 - 3) = 15!
86
�
�
“buch” — 2017/10/6 — 8:49 — page 87 — #83
�
�
�
�
�
�
3
3.5 Eigene Operatoren
Detailinformationen zu den Prioritätsgruppen sowie weitere Operator-Interna können Sie
im Proposal 0077 nachlesen. Es fasst all die Änderungen zusammen, die in Swift 3 im Bereich
der Operatoren durchgeführt wurden und die seither gelten.
https://github.com/apple/swift-evolution/blob/master/proposals/0077-operator-
precedence.md
3.5 EigeneOperatoren
Swift bietet Ihnen die Möglichkeit, vorhandenen Operatoren für bestimmte Datentypen
neue Funktionen zuzuweisen (Operator Overloading). Außerdem können Sie vollkommen
neue Operatoren definieren.
Operatoren sind aus der Sicht von Swift ein Sonderfall globaler Funktionen, wobei der
Funktionsname aus Operatorzeichen besteht. Insofern greift dieser Abschnitt Kapitel 6,
»Funktionen und Closures«, vor. Binäre Operatoren erwarten zwei, unäre Operatoren einen
Parameter.
Reservierte Operatoren
Die folgenden Zeichen, Zeichenkombinationen bzw. Operatoren sind reserviert und können
nicht verändert werden:
= -> // /* */ . > ! ?
Operator Overloading für komplexe Zahlen
Das folgende Beispiel zeigt, wie einfach Operator Overloading ist. Im Beispiel wird zuerst
die Datenstruktur Complex zur Speicherung komplexer Zahlen mit Real- und Imaginärteil
definiert. Die weiteren Zeilen zeigen die Implementierung der Operatoren + und * zur Ver-
arbeitung solcher Zahlen.
// Beispieldatei operator -overloading .playground// Datenstruktur zur Speicherung komplexer Zahlenstruct Complex {
var re: Doublevar im: Double
// Init -Funktion , um eine neue komplexe Zahl zu erzeugeninit(re: Double , im: Double ) {
self.re=reself.im=im
}}
87
�
�
“buch” — 2017/10/6 — 8:49 — page 88 — #84
�
�
�
�
�
�
3 Operatoren
// Addition komplexer Zahlenfunc + (left: Complex , right: Complex ) -> Complex {
return Complex (re: left.re + right.re, im: left.im + right.im)}
// Multiplikation komplexer Zahlenfunc * (left: Complex , right: Complex ) -> Complex {
return Complex (re: left.re * right.re - left.im * right.im,im: left.re * right.im + left.im * right.re)
}
// Vergleich komplexer Zahlenfunc == (left: Complex , right: Complex ) -> Bool {
return left.re == right.re && left.im == right.im}func != (left: Complex , right: Complex ) -> Bool {
return !(left==right)}
// Operatoren anwendenvar a = Complex (re: 2, im: 1) // 2 + ivar b = Complex (re: 1, im: 3) // 1 + 3ivar c = a + b // 3 + 4ivar d = a * b // -1 + 7i
Bei der Definition unärer Operatoren muss mit dem Schlüsselwort prefix bzw. postfix
angegeben werden, ob der Operator vor oder nach demOperanden angegeben wird. Die Defi-
nition des Operators für negative Vorzeichen bei komplexen Zahlen sieht so aus:
// negatives Vorzeichen für komplexe Zahlenprefix func - (op: Complex ) -> Complex {
return Complex (re: -op.re, im: -op.im)}
// Anwendungvar e = -d // 1 - 7i
Neuer Vergleichsoperator für Zeichenketten
Für aktuell nicht genutzte Zeichenkombinationen können Sie selbst neue Operatoren defi-
nieren. Dazu müssen Sie den Operator mit infix|prefix|postfix operator zuerst definieren
und einer Prioritätsgruppe zuordnen (siehe Tabelle 3.3). Wenn Sie darauf verzichten, zählt Ihr
Operator automatisch zur Gruppe DefaultPrecedence .
Das folgende Beispiel definiert einen Vergleichsoperator für Zeichenketten, der nicht zwi-
schen Groß- und Kleinschreibung unterscheidet. infix bezeichnet dabei einen Operator für
88
�
�
“buch” — 2017/10/6 — 8:49 — page 89 — #85
�
�
�
�
�
�
3
3.5 Eigene Operatoren
zwei Operanden. Der Operator =~= erhält dieselbe Priorität wie die anderen Vergleichsopera-
toren.
// Datei comparision -operator .swift// neuen Vergleichsoperator definieren , ...infix operator =~= : ComparisonPrecedence
Die Implementierung greift auf die compare-Methode zurück. Besser lesbar, aber weniger effi-
zient wäre return left.uppercased()== right.uppercased().
// ... implementieren ,func =~= (left: String , right: String ) -> Bool {
return left.compare (right , options : .caseInsensitive ) == .orderedSame}
// ... und ausprobieren"abc" =~= "Abc" // true"äöü" =~= "ÄöÜ" // true
Neuer Exponential-Operator in einer eigenen Prioritätsgruppe
Sie sind bei der Definition eigener Operatoren nicht auf die vorgegebenen Prioritätsgrup-
pen beschränkt. Das folgende Beispiel greift eine Idee aus dem schon erwähnten Proposal
0077 auf und definiert den Exponential-Operator ** für Double-Zahlen. Der Operator wird
der ebenso neuen Gruppe ExponentiationPrecedence zugeordnet. Diese Gruppe hat eine
höhere Priorität als MultiplicationPrecedence , mehrere aufeinanderfolgende Exponential-
Operatoren werden von links nach rechts verarbeitet.
// Datei comparision -operator .swift
// neue Priorit ätsgruppe für Exponential -Operatorenprecedencegroup ExponentiationPrecedence {
associativity : lefthigherThan : MultiplicationPrecedence
}
// neuer Exponential -Operatorinfix operator ** : ExponentiationPrecedence
// Implementierungfunc ** (base: Double , exponent : Double ) -> Double {
return pow(base , exponent )}
let result = 1 + 2 ** 3 // 1 plus (2 hoch 3) , Ergebnis 9
89
�
�
“buch” — 2017/10/6 — 8:49 — page 90 — #86
�
�
�
�
�
�
3 Operatoren
Neuer Unwrap-or-Die-Operator
Erica Sadun hat in der Swift-Evolution-Mailing-Liste vorgeschlagen, die Sprache Swift umden
Operator !! zu erweitern, der das Auspacken eines Optionals erzwingt. Gelingt dies nicht,
wird ein Fehler ausgelöst. Die Anwendung dieses Operators sieht so aus:
let result = [1, 2, 3]let firstresult = result .first !! "Fehlermeldung "print(firstresult )
Es gibt also einen optionalen Ausdruck (hier first, liefert nil, wenn das Array leer ist), und
Ihr Code verlässt sich darauf, dass der Ausdruck ein Ergebnis liefert. Sie könnten nun einfach
durch first! das Auspacken erzwingen; sollte aber doch ein Fehler auftreten, dann haben
Sie keine Fehlermeldung. Mit der Konstruktion !! "Fehlermeldung" können Sie hingegen auf
die Ursache des Problems hinweisen. (Der Operator !! ist Ausdrucks des Frusts, den viele
Swift-Entwickler im Umgangmit Optionals und der erforderlichen Absicherung durch guard,
if let etc. empfinden.Mehr Informationen zudiesemThema folgen inAbschnitt 4.2, »Optio-
nals«, sowie in Kapitel 13, »Fehlerabsicherung«.)
Die Swift-Entwicklergemeinde hat sich nicht dazu durchringen können, den Operator zum
Swift-Sprachumfang hinzuzufügen. Aber das können Siemit wenigen Zeilen selbst erledigen:
// Projekt unwrap -or-die -operator , Datei main.swiftinfix operator !!: NilCoalescingPrecedenceextension Optional {
// Idee: Erica Sadun 2017public static func !!(optional : Optional ,
errorMessage : @autoclosure () -> String )-> Wrapped
{if let value = optional { return value }fatalError (errorMessage ())
}}
Details zur Implementierungdieses Operators sowiedieDiskussion in derMailing-Liste samt
einiger alternativer Vorschläge für ähnlich geartete Operatoren finden Sie hier:
https://gist.github.com/erica/423e4b1c63b95c4c90338cdff4939a9b
https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170626/thread.html
Weitere Beispiele für eigene Operatoren
In diesem Buch zeige ich Ihnen inmehreren Abschnitten, wie Sie eigene Operatoren gewinn-
bringend zur Formulierung klareren Codes definieren können:
90
�
�
“buch” — 2017/10/6 — 8:49 — page 91 — #87
�
�
�
�
�
�
3
3.5 Eigene Operatoren
In Abschnitt 7.3, »CGFloat, CGPoint, CGSize und Co.«, zeige ich Ihnen, wie Sie Operatoren
definieren, um bequem Berechnungen mit Koordinatenpunkten, Vektoren etc. durchzu-
führen.
In Abschnitt 8.5, »Zeichenketten und Zahlen umwandeln«, stelle ich Ihnen einen Dreizei-
ler vor, der den aus Python bekannten Operator % zur Formatierung von Zeichenketten
definiert.
In Abschnitt 11.5, »Methoden«, habe ich in einem Beispiel, das den Unterschied zwischen
verschiedenenMethodentypen zeigt, auch die Operatoren < und > definiert. Sie ermitteln,
welcher von zwei 3D-Vektoren kürzer ist.
91
�
�
“buch” — 2017/10/6 — 8:49 — page 373 — #369
�
�
�
�
�
�
15
Kapitel 15
Hello iOS-World!
Mit diesem Kapitel beginnt nun endlich die konkrete iOS-Programmierung. In seinem
Zentrum steht ein einfaches Hello-World-Programm. Das Ziel ist es, Sie mit den Grundfunk-
tionen von Xcode sowie mit einigen Konzepten der iOS-Programmentwicklung bekannt zu
machen.
Bei der Lektüre dieses und auch des nächsten Kapitels werden Sie feststellen, dass Swift vor-
übergehend in denHintergrund rückt. Natürlichmüssen Sie da und dort ein paar Zeilen Code
schreiben; aber gerade bei den ersten iOS-Programmen geht es vielmehr darum, den effizien-
ten Umgang mit Xcode zu erlernen, die grafische Gestaltung von Apps kennenzulernen und
grundlegende Konzepte der iOS-Programmentwicklung zu verstehen. Dennoch setze ich ab
diesem Kapitel voraus, dass Sie zumindest über elementare Grundkenntnisse in Swift verfü-
gen. Insbesondere die grundlegenden Sprachstrukturen, Datentypen und der Umgang mit
Optionals sollten Ihnen geläufig sein.
Xcode per Video kennenlernen
Ich wäre nicht seit 30 Jahren mit Begeisterung Autor, würde ich nicht aus vollster Überzeu-
gung das Medium Buch lieben. Aber es heißt ja, ein Bild sagt mehr als tausend Worte, und
man könnte diese Analogie noch fortführen: Ein Video sagtmehr als tausend Bilder.Mitunter
stimmt das sogar, z. B. wenn es darum geht, die Bedienung von Xcode zu erlernen.
Ohne Sie hier an die Konkurrenz verweisen zu wollen, möchte ich Ihnen doch ein Video-
Tutorial ans Herz legen, das qualitativ meilenweit über den vielen YouTube-Filmchen der Art
»Jetzt lerne ich iOS-Programmierung« steht. Die renommierte Stanford Universität hat eine
mehr als 20-stündige Vorlesung zum Thema »Developing iOS 10 Apps with Swift« kostenlos
im iTunes U-Programm verfügbar gemacht. Um die Videos ansehen zu können, benötigen Sie
entweder iTunes auf Ihrem Mac oder die App iTunesU für das iPad. Grundlegende Englisch-
kenntnisse reichen aus, um dem mit vielen Screencasts unterlegten Vortrag zu folgen. Die
Videos basierenmomentan auf Swift 3.0, es ist aber zu hoffen, dass es 2018 eine aktualisierte
Fassung gibt, die iOS 11 und vor allem Swift 4 berücksichtigt.
https://itunes.apple.com/us/course/developing-ios-10-apps-with-swift/id1198467120
373
�
�
“buch” — 2017/10/6 — 8:49 — page 374 — #370
�
�
�
�
�
�
15 Hello iOS-World!
15.1 Projektstart
Um eine App für ein iOS-Gerät zu entwickeln, also für ein iPhone, ein iPad oder einen iPod,
starten Sie in Xcode ein neues Projekt und wählen zuerst den Typ iOS • Single View Appli-
cation. Das ist die einfachste Art von iOS-Apps. Anfänglich besteht eine derartige App aus
einer einzigen Ansicht, also aus einem »Bildschirm«, aus einer »Seite«. Sie können aber spä-
ter problemlos weitere Ansichten hinzufügen. Der anfängliche Projekttyp schränkt Sie also
nicht bei der späterenWeiterentwicklung der App ein.
Im nächsten Dialogblatt geben Sie Ihrem Projekt einen Namen und wählen als Programmier-
sprache Swift aus. Der Dialog enthält drei Optionen (siehe Abbildung 15.1), die Sie alle drei
nicht aktivieren müssen. (Core Data ist ein Framework, um die App mit einer Datenbank zu
verbinden. Die beiden anderen Optionen betreffen automatisierbare Tests.)
Use Core Data ist nur dann relevant, wenn Sie die Daten Ihrer App in einem Objekt-
Relationen-Mapping-Modell speichernmöchten.
Include Unit Tests und Include UI Tests fügen Ihrem Projekt jeweils ein eigenes Ver-
zeichnis hinzu, in dem Sie Testfunktionen für Ihren Code bzw. für die Benutzeroberfläche
unterbringen können.
Abbildung 15.1 Projektoptionen für das Hello-iOS-Projekt
Zuletzt müssen Sie noch das Verzeichnis angeben, in demXcode die Code-Dateien des neuen
Projekts speichern soll.
374
�
�
“buch” — 2017/10/6 — 8:49 — page 375 — #371
�
�
�
�
�
�
15
15.2 Gestaltung der App
15.2 Gestaltungder App
Das neue Projekt besteht aus einer ganzen Reihe von Dateien, deren Namen in der lin-
ken Spalte von Xcode im Projektnavigator zu sehen sind. Sollte Xcode den Projektnavigator
nicht anzeigen, führen Sie Views •Navigator • Project Navigator aus oder drücken ein-
fach (Š)+(1). Im Projektnavigator klicken Sie nun auf die Datei Main.storyboard.
ImHauptbereich von Xcode sehen Sie jetzt das sogenannte Storyboard (sieheAbbildung 15.2).
Anfänglich besteht dieses Drehbuch für iOS-Apps aus nur einer, vorerst leeren Szene, also
einer Bildschirmansicht der App. (Die technische Bezeichnung lautet View-Controller. Details
zur Nomenklatur folgen auf der nächsten Seite.) Bei vielenApps gesellen sich dazu später wei-
tere Seiten, zwischen denen die Anwender dann navigieren können. Im Hello-World-Beispiel
wird es aber bei einer Ansicht bleiben.
Abbildung 15.2 Das Storyboard mit dem einzigen View-Controller der Hello-World-App
Device-Größe
Bei neuen iOS-Apps zeigt Xcode die Ansichten der App im Storyboard so an, wie diese auf
einem iPhone 8 im Hochformat aussehen würden. Wenn Sie in der Fußleiste des Storyboard-
Editors auf View as iPhone 8 klicken, blendet Xcode eine Auswahl von iOS-Geräten mit
anderen Bildschirmformaten ein. Per Knopfdruck können Sie nun zwischen diesen Formaten
wählen (siehe Abbildung 15.2).
375
�
�
“buch” — 2017/10/6 — 8:49 — page 376 — #372
�
�
�
�
�
�
15 Hello iOS-World!
Dieses Feature ermöglicht es Ihnen, blitzschnell zu überprüfen, wie Ihre App auf unterschied-
lichen Geräten aussehen wird. Anfänglich wird Ihre App nicht auf die unterschiedlichen
Bildschirmproportionen und -maße reagieren. Abhilfe schaffen sogenannte Layoutregeln, die
ich Ihnen in Abschnitt 15.5, »Layout optimieren«, und detaillierter nochmals in Abschnitt 16.5,
»Auto Layout«, vorstellen werde.
Ich verwende bei der Entwicklung meiner Apps meistens die Device-Größe »iPhone SE«. Das
spart einerseits wertvollen Platz im Storyboard-Editor und gibt mir andererseits eine gute
Vorstellung davon, wie die App auf dem kleinsten infrage kommenden Gerät aussehen wird.
In der Regel ist die Optimierung für kleine Bildschirme schwieriger als die für große.
Mini-Glossar
Bevor Sie damit beginnen, die Hello-World-App zu gestalten, sollten Sie zumindest die
wichtigsten Grundbegriffe aus der iOS-Entwicklerwelt kennen: Eine App kann aus mehre-
ren Ansichten bestehen. Solche Ansichten nennt Xcode Szenen. Jede Szene kann diverse
Steuerelemente enthalten, die das Aussehen der Ansicht bestimmen. Alle Einstellungen aller
Szenen sowie der darin enthaltenen Steuerelemente werden im Storyboard gespeichert.
Jede Szene wirdmit einer Code-Datei verbunden, dem Controller. Im Controller legen Sie fest,
wie Ihre App auf Ereignisse reagiert. Der Controller bestimmt also,wie sich Ihre App verhalten
soll, wenn ein Benutzer einen Button berührt, einen Slider verschiebt etc. Das dem Control-
ler zugrunde liegende Programmiermuster, den Model-View-Controller, stelle ich Ihnen in
Abschnitt 16.1 näher vor.
Standardmäßig enthält ein neues Projekt vom Typ Single ViewApplication die Storyboard-
Datei Main.storyboard mit der Szene View-Controller und dem zugeordneten Controller
in der Datei ViewController.swift. Um später weitere Szenen hinzuzufügen, verschieben
Sie einen View-Controller aus der Xcode-Objektbibliothek in das Storyboard. Während
im Storyboard beliebig viele Szenen gespeichert werden können, benötigen Sie im Regel-
fall zu jeder Szene eine eigene Swift-Code-Datei mit dem Controller. Mitunter können Sie
auch eine Controller-Klasse mehreren ähnlichen Szenen zuordnen. Wie Sie selbst neue
Controller-Klassen einrichten, beschreibe ich in Abschnitt 17.1, »Storyboard und Controller-
Klassen verbinden«.
Vorsicht bei Umbenennungen!
Die grafische Darstellung des Storyboards in Xcode ist sehr ansprechend. Intern handelt es
sich beim Storyboard aber um eine simple XML-Datei. Dabei ist es wichtig zu wissen, dass
die Referenzen vom Storyboard auf Code-Elemente und Komponenten ausschließlich in Form
von Zeichenketten erfolgen.
376
�
�
“buch” — 2017/10/6 — 8:49 — page 377 — #373
�
�
�
�
�
�
15
15.2 Gestaltung der App
Die Versuchung ist groß, Outlets, Actions, Klassennamen etc. nachträglich zu verändern,
wenn sich die ursprünglich gewählten Namen als irreführend oder zu wenig prägnant
erweisen. Dabei sollten Sie unbedingt das in Xcode 9 eingeführte Kontextmenükommando
Refactor • Rename verwenden, dessen Funktion auch das Storyboard einschließt. Andern-
falls passen die im Code und die im Storyboard verwendeten Namen nicht mehr zusammen.
Abhilfe schafft dann nur das Neuverbinden von Actions und Outlets. Gerade für Xcode-
Einsteiger ist das schwierig, zumal die wahre Ursache des Problems oft schwer zu erkennen
ist.
Steuerelemente einfügen
Die Benutzeroberfläche unserer Hello-World-App ist anfänglich leer. In die Ansicht sollen
nun zwei Bestandteile (Steuerelemente) eingebaut werden: ein Button mit der Aufschrift
Hello World! und ein leeres Textfeld. Jedes Mal, wenn Sie den Button Hello World! ankli-
cken, soll im Textfeld eine neue Zeile mit dem aktuellen Datum und der Uhrzeit eingefügt
werden (siehe Abbildung 15.3).
Abbildung 15.3 Die Hello-World-App im iOS-Simulator, hier in der iPhone-X-Ausprägung
377
�
�
“buch” — 2017/10/6 — 8:49 — page 378 — #374
�
�
�
�
�
�
15 Hello iOS-World!
Xcode zeigt die zur Auswahl stehenden Steuerelemente normalerweise rechts unten in der
Objektbibliothek an. Sollten die Steuerelemente bei Ihnen nicht sichtbar sein, blenden Sie
diesen Bereich der Werkzeugleiste mit View•Utilities • Show Object Library bzw. mit
(ctrl)+(alt)+(Š)+(3) ein.
Xcode kann die Objektbibliothek in einer kompakten Icon-Ansicht oder in einer Listen-
ansicht darstellen. Wechseln Sie gegebenenfalls mit dem Button am unteren Rand der
Objektbibliothek in die übersichtlichere Listenansicht. Im daneben befindlichen Suchfeld
können Sie in der Liste rasch die gewünschten Einträge ermitteln – suchen Sie nach button
bzw. text view.
Klicken Sie zuerst den Button an, und verschieben Sie ihn per Drag&Drop in den quadra-
tischen View-Controller des Storyboards. Platzieren Sie den Button links oben, und ändern
Sie dann den Text von Button zu Hello World (siehe Abbildung 15.2). Wenn Sie möchten,
können Sie im Attributinspektor links oben in der Werkzeugleiste die Button-Schrift etwas
größer einstellen. Den Attributinspektor blenden Sie bei Bedarf mit (alt)+(Š)+(4) ein.
Nun ist das Text-View-Steuerelement an der Reihe: Suchen Sie in der Objektbibliothek nach
diesem Steuerelement, und verschieben Sie es per Drag&Drop in das Storyboard. Platzieren
Sie das Steuerelement unterhalb des Buttons, und stellen Sie die Größe so ein, dass es circa
ein Viertel des quadratischen Storyboards füllt. Wie gesagt, mit den Feinheiten des Layouts
beschäftigen wir uns später. Stellen Sie nun die gewünschte Textgröße ein, und löschen Sie
den Blindtext »Lorem ipsum . . . « im Attributinspektor.
Wenn Sie möchten, können Sie dem Textfeld auch noch eine andere Hintergrundfarbe
zuweisen – dann erkennen Sie später bei der Programmausführung besser die tatsächlichen
Ausmaße des Steuerelements. Zur Farbeinstellung scrollen Sie im Attributinspektor nach
unten, bis Sie relativ weit unten im Bereich View das Feld Background finden.
Ein erster Test mit dem iOS-Simulator
Nachdemwir nundieminimalistischeOberfläche unserer App gestaltet haben, sprichtnichts
dagegen, das Programm ein erstes Mal zu starten. Dazu wählen Sie in der Symbolleiste des
Xcode-Fensters zuerst das Gerät aus, das Sie simulieren möchten. Zur Auswahl steht die gän-
gige iOS-Hardware-Palette.
Ein Klick auf den dreieckigen Run-Button kompiliert das Programm und übergibt es zur
Ausführung an den iOS-Simulator (siehe Abbildung 15.3). Dabei handelt es sich um ein eigen-
ständiges Programm, das getrennt von Xcode läuft. Wie der Name vermuten lässt, simuliert
es ein iPhonebzw. iPad, wobei das zu testende Programmzur Ausführung automatisch instal-
liert wird. Der Simulator ist zumindest für erste Tests gut geeignet. Für »echte« Apps führt an
Tests auf richtiger Hardware aber natürlich kein Weg vorbei.
378
�
�
“buch” — 2017/10/6 — 8:49 — page 379 — #375
�
�
�
�
�
�
15
15.2 Gestaltung der App
Spracheinstellungen im Simulator
Im Simulator gelten anfänglich englische Spracheinstellungen. Das lässt sich wie auf einem
richtigen Gerät in den Systemeinstellungen beheben. Dazu beenden Sie die laufende Hello-
World-App durch einen Klick auf den iPhone-Button (»Home-Button«). Anschließend starten
Sie die vorinstallierte App Settings, navigieren in den Dialog General • Language & Region
und stellen dort die Sprache Deutsch und die Region Germany ein.
Diesen Vorgang müssen Sie für jedes iOS-Gerät wiederholen, das Sie testen möchten. Die
Einstellungenwerden also nicht über alle simulierten Geräte geteilt.
Da die Veränderung der Spracheinstellungen in allen iOS-Geräten recht umständlich ist, bie-
tet Xcode auch die Möglichkeit, mit Product • Scheme • Edit Scheme festzulegen, in welcher
Sprache die App ausgeführt werden soll. Das Hello-World-Kapitel ist aber nicht der richtige
Ort für diese schon recht fortgeschrittenen Funktionen. Details zum Umgang mit Schemes
und zur Entwicklungmehrsprachiger Apps folgen in Abschnitt 31.4.
Im iOS-Simulator können Sie nun den ButtonHelloWorld! anklicken. Das Programmwird
darauf aber nicht reagieren, weil der Button ja noch nicht mit Code verbunden ist. Wenn
Sie das Textfeld anklicken, können Sie über die Tastatur Ihres Computers sowie über die im
Simulator eingeblendete Bildschirmtastatur Text eingeben. Die Test-App läuft, bis Sie sie in
Xcodemit dem Stopp-Button beenden.
Ärger mit der Tastatur
Sie können im iOS-Simulator mit der Tastatur Ihres Computers Eingaben durchführen. Das
ist effizient, aber nicht realitätsnah: Der Simulator betrachtet Ihre Tastatur als mit dem iOS-
Gerät verbunden und blendet deswegen die iOS-Bildschirmtastaturaus.Mit dem Kommando
Hardware • Keyboard •Connect Hardware Keyboard im iOS-Simulator können Sie auswäh-
len, ob Sie Ihre Computertastatur oder die Bildschirmtastatur von iOS verwenden möchten.
Sobald die iOS-Bildschirmtastatur einmal im iOS-Simulator erscheint, tritt ein weiteres Pro-
blem auf: Es scheint keine Möglichkeit zu geben, die Tastatur wieder loszuwerden. Das ist
das in iOS vorgesehene Verhalten – wenn die Eingabe abgeschlossen ist, muss die Tasta-
tur per Code explizit ausgeblendet werden, in der Regel durch die Anweisung view.end-Editing(true). Im Hello-World-Projekt verzichten wir darauf.
Praktische Details zum richtigen Umgang mit Textfeldern folgen in Abschnitt 16.9, »Textein-
gaben«, sowie in mehreren Beispielprojekten in Teil IV dieses Buchs.
379
�
�
“buch” — 2017/10/6 — 8:49 — page 380 — #376
�
�
�
�
�
�
15 Hello iOS-World!
15.3 Steuerungder App durch Code
Damit das Berühren des Buttons auf einem iPhone bzw. das Anklicken des Buttons im Simu-
lator eine sichtbareWirkung zeigt, soll die App jetzt so erweitert werden, dass in das Textfeld
jedes Mal eine Zeile mit dem Datum und der aktuellen Uhrzeit eingefügt wird. Das erfordert
einige Zeilen Swift-Code.
Den Buttonmit einer Methode verbinden (Actions)
Mit der App-Ansicht (Szene) verbundener Code muss nun in die bereits vorgesehene Datei
ViewController.swift eingetragen werden. Xcode unterstützt diesen Vorgang, sofern das
Storyboard und die damit verbundene Datei ViewController.swift nebeneinander angezeigt
werden. Genau das bewirkt der Button mit den »Eheringen«: Er blendet zur gerade aktiven
Datei den sogenannten Assistenzeditor ein, also eine zugeordnete zweite Datei.
Platz sparen in Xcode
Wenn Sie nicht gerade auf einem sehr großen Monitor arbeiten, wird der Platz in Xcode
jetzt knapp. Links sitzt der Projektnavigator, in der Mitte das Storyboard und der Code des
Controllers und rechts noch die Werkzeugleiste – das ist zu viel! Blenden Sie deswegen vor-
übergehend die beiden Seitenleisten aus. Die entsprechenden Buttons finden Sie rechts oben
in der Xcode-Symbolleiste.
ViewController.swift enthält den Swift-Code für eine Klassemit demNamen ViewController.
Diese Klasse ist von der UIViewController-Klasse abgeleitet. Wie der Name vermuten lässt,
steuert diese Klasse das App-Erscheinungsbild. Der View-Controller enthält bereits zwei leere
Methoden. Diese sind für uns vorerst aber nicht von Interesse; wenn Siemöchten, können Sie
sie löschen. In diesemHello-World-Beispiel benötigen wir sie nicht.
Dafür möchten wir nun eine Methode in den Code einbauen, die ausgeführt wird, wenn
der Button Hello World angeklickt wird. Dazu drücken Sie die Taste (ctrl) und ziehen den
Button vom Storyboard in den Assistenzeditor. Die Methode soll direkt in der Klasse und
nicht innerhalb einer anderen Methode eingefügt werden. Achten Sie darauf, die Maus- bzw.
Trackpad-Taste an der richtigen Stelle loszulassen! Bis dahin markiert eine blaue Linie die
Verbindung, die Sie herstellenmöchten.
Sobald Sie die Maus bzw. das Trackpad losgelassen haben, erscheint ein Dialog, in dem Sie
die Details der Verbindung einstellen können (siehe Abbildung 15.4). Für uns sind folgende
Einstellungen zweckmäßig:
Connection = Action: Wir wollen auf ein Ereignis reagieren. Der Begriff Action bezieht
sich dabei auf das Target-Action-Entwurfsmuster, bei dem eine Methode in die eigene
Controller-Klasse eingebaut wird. Sie gilt als »Ziel«, das angesprungen wird, wenn das ent-
sprechende Ereignis auftritt.
380
�
�
“buch” — 2017/10/6 — 8:49 — page 381 — #377
�
�
�
�
�
�
15
15.3 Steuerung der App durch Code
Object: Das Feld gibt das Basisobjekt der Aktion an. Die Voreinstellung lautet View Con-
troller und bleibt immer unverändert.
Name: Hier geben wir der zu erstellenden Methode einen möglichst aussagekräftigen
Namen. Ich habe mich bei diesem Beispiel für hwButtonTouch entschieden. Wenn Sie das
Beispiel selbst ausprobieren, können Sie hier einen beliebigen anderen Namen wählen.
Type =AnyObjectoderUIButton: Diese Einstellung gibt an, inwelcher FormDaten an die
Methode übergeben werden sollen. Im Hello-World-Beispiel werten wir diese Daten aber
ohnehin nicht aus – insofern ist die Einstellung egal. Wollten wir den Text des Buttons
oder andere Eigenschaften auslesen, wäre es zweckmäßig, hierUIButton einzustellen.
Event = Touch Up Inside: Hier wird festgelegt, auf welches Ereignis wir reagieren möch-
ten. Die Defaulteinstellung passt hier: Wenn der Button innen berührt wird, soll unser
Code ausgeführt werden.
Arguments = Sender: In der Auswahlliste können Sie festlegen, welche Daten an die
Methode übergeben werden sollen. Zur Auswahl stehen Sender, Sender and Event oder
None. Die Einstellung Sender bedeutet, dass eine Referenz auf das Objekt übergeben wird,
das die Aktion ausgelöst hat. Das vereinfacht die Auswertung der Daten dieses Objekts –
insbesondere dann, wenn Sie eine Action-Methode mit mehreren Steuerelementen ver-
binden.
Abbildung 15.4 Der Button des Storyboards (links) wird durch ctrl-Drag mit einer neuenMethode
im ViewController-Code (rechts) verbunden.
381
�
�
“buch” — 2017/10/6 — 8:49 — page 382 — #378
�
�
�
�
�
�
15 Hello iOS-World!
Die hier so langatmig beschriebenen Einstellungen nehmen Sie mit etwas Übung in gerade
mal 15 Sekunden vor. Xcode belohnt diese Arbeit mit einer Methodendefinition, die aus zwei
Zeilen Code besteht:
// Projekt hwios -world , Datei ViewController .swift@IBAction func hwButtonTouch (_ sender : UIButton ) {
// todo: Code verfassen}
Der Code allein reicht nicht!
Angesichts des doch recht umständlichen Mausgeklickes liegt es nahe, den wenigen Code
einfach selbst einzutippen. Das ist aber keine gute Idee! Mit dem Code an sich ist es näm-
lich nicht getan. Hinter den Kulissenmerkt sich Xcode auch,mit welchem Steuerelement und
mit welchem Ereignis die Methode verknüpft ist. Diese Metadaten landen in der XML-Datei
Main.storyboard. Die Verbindung stellt Cocoa Touch dynamisch zur Laufzeit her. Das kompi-
lierte Storyboard enthält dafür eine Referenz auf den serialisierten View-Controller und den
Selektor auf die Methode.
Zugriff auf das Textfeld über eine Eigenschaft (Outlets)
Bevor wir die Methode hwButtonTouch mit konkretem Code füllen können, benötigen wir
noch eineMöglichkeit, um auf das Textfeld zuzugreifen. Dazu stellenwir eine weitere Verbin-
dung zwischen der App-Ansicht im Storyboard und dem Code her: Wieder mit (ctrl) ziehen
wir diesmal das Text-View-Steuerelement in den Codebereich, verwenden diesmal aber
andere Einstellungen (siehe Abbildung 15.5):
Connection = Outlet: Wir wollen auf das Steuerelement zugreifen können. Xcode soll
also eine entsprechende Eigenschaft in die ViewController-Klasse einbauen, die auf das
Objekt verweist. In der iOS-Nomenklatur wird das alsOutlet bezeichnet.
Object: Das Feld gibt das Basisobjekt der Aktion an. Die Voreinstellung View Controller
kann nicht geändert werden.
Name: Das ist der Name, unter demwir das Steuerelement ansprechenmöchten. Ich habe
textView angegeben.
Type =UITextView: Das Steuerelement ist eine Instanz der UITextView-Klasse – und unter
diesem Typmöchten wir auf das Steuerelement auch zugreifen.
Storage =Weak: Hier geht es darum, ob die Referenz auf das Steuerelement sicherstellt,
dass dieses im Speicher bleibt. Das ist nicht notwendig: Das Steuerelement kommt uns
sicher nicht abhanden. Insofern können wir die Defaulteinstellung Weak bedenkenlos
übernehmen.
382
�
�
“buch” — 2017/10/6 — 8:49 — page 383 — #379
�
�
�
�
�
�
15
15.3 Steuerung der App durch Code
Abbildung 15.5 Einstellungen für das textView-Outlet
Die resultierende Code-Zeile sieht so aus:
@IBOutlet weak var textView : UITextView !
Damit ist also eine neue Eigenschaft (Klassenvariable) mit dem Namen textView definiert.
Wir können mit ihr auf ein Steuerelement vom Typ UITextView zugreifen, wobei der Typ
als Optional angegeben ist. Der Grund dafür ist, dass die Initialisierung des Steuerelements
möglicherweise nicht sofort beim App-Start, sondern erst etwas später erfolgt. Indem die
Eigenschaft als Optional deklariert ist, wird klar, dass ein Zugriff auf das Steuerelement unter
Umständen noch gar nicht möglich ist.
Die Attribute »@IBAction« und »@IBOutlet«
Sicher ist Ihnen aufgefallen, dass Xcode die Methode mit dem Attribut @IBAction und die
Eigenschaft mit dem Attribut @IBOutlet gekennzeichnet hat. Der Interface Builder erkennt
anhand dieser Attribute, zu welchen Elementen der Programmierer Verbindungen erlaubt
bzw. herstellen darf. Der Interface Builder ist jener Teil von Xcode, der zur Gestaltung grafi-
scher Benutzeroberflächen dient.
Endlich eigener Code
Sie können dieApp zwischenzeitlich noch einmal starten. AmVerhalten der App hat sich aber
nichts verändert. Die Methode hwButtonTouch ist ja noch leer, und auch die zusätzliche Eigen-
schaft textView ist noch ungenutzt. Aber das ändert sich jetzt endlich! Jedes Mal, wenn der
Button Hello World berührt wird, soll das Textfeld um eine Zeile mit Datum und Uhrzeit
ergänzt werden. In einer ersten Testversion könnte der Code wie folgt aussehen:
// Projekt Hello iOS, Datei ViewController .swiftimport UIKitclass ViewController : UIViewController {
@IBOutlet weak var textView : UITextView !
383
�
�
“buch” — 2017/10/6 — 8:49 — page 384 — #380
�
�
�
�
�
�
15 Hello iOS-World!
@IBAction func hwButtonTouch (_ sender : UIButton ) {let now = Date()
// zur Formattierung des Datumslet formatter = DateFormatter ()formatter .dateFormat = "d.M.yyyy H:mm:ss"
// Text im Text -View -Steuerelement hinzuf ügentextView .text? += formatter .string (from: now) + "\n"
}}
Auf den Abdruck der standardmäßig vorhandenen, aber leeren Methoden viewDidLoad und
didReceiveMemoryWarning habe ich verzichtet. In diesem Beispiel können Sie diese Methoden
aus dem Code löschen, wir brauchen sie nicht.
Outlets wie die Eigenschaft textView sind Optionals. Es liegt in der Natur von Optionals, dass
diese den Zustand nil haben können. Tatsächlich ist dies aber nur vor der Initialisierung der
Ansicht der Fall. Sobald die Ansicht auf einem iOS-Gerät sichtbar wird und Action-Methoden
ausführen kann, können Sie sich darauf verlassen, dass Outlet-Eigenschaften nicht nil sind.
Genau genommen gilt dies ab dem Zeitpunkt, zu dem im View-Controller die Methode
viewDidLoad ausgeführt wurde (siehe Abschnitt 16.3, »Die UIViewController-Klasse«).
Hintergrundinformationen zum Umgang mit Datum und Uhrzeit können Sie bei Bedarf in
Kapitel 9 nachlesen. Somit bleibt nur noch der Ausdruck textView.text zu erklären: Ein Blick
in die Dokumentation des UITextView-Steuerelements zeigt, dass der Inhalt des Textfelds
über die Eigenschaft text gelesen und verändert werden kann. Der Datentyp von text lautet
String?, es handelt sich also um ein Optional, das beim Zugriff explizit durch ein nachgestell-
tes Fragezeichen oder Ausrufezeichen ausgepackt werden muss.
Der schnellste Weg zur Dokumentation
Wenn Sie zum ersten Mal ein UITextView-Steuerelement nutzen, kennen Sie die Elemente
dieser Klasse noch nicht. Eine kurze Beschreibung der Klasse erhalten Sie, wenn Sie das
Schlüsselwort UITextView im Code zusammenmit (alt) anklicken. Am unteren Rand der ein-
geblendeten Infobox befindet sich ein Link auf die Klassenreferenz, die in einem eigenen
Fenster geöffnet wird (siehe Abbildung 15.6).
Jetzt ist es höchste Zeit, die App im Simulator endlich auszuprobieren. Einige Klicks auf den
Button beweisen, dass das Programmwie erwartet funktioniert (siehe Abbildung 15.3). Einen
Preis für innovatives Layout wird es freilich nicht gewinnen.
384
�
�
“buch” — 2017/10/6 — 8:49 — page 385 — #381
�
�
�
�
�
�
15
15.4 Actions und Outlets für Fortgeschrittene
Abbildung 15.6 Der Hilfebrowser von Xcode
15.4 Actions und Outlets für Fortgeschrittene
Sie haben nun eine erste Vorstellung davon, wozu Actions und Outlets verwendet werden.
Dieser Abschnitt weist auf einige Besonderheiten im Umgang mit Actions und Outlets hin.
Eine Action für mehrere Steuerelemente
Es ist zulässig, ein und dieselbe Action-Methode für mehrere Steuerelemente zu verwenden.
Dazu richten Sie zuerst für ein Steuerelement dieMethode ein. Danach führen Sie eine (ctrl)-
Drag-Operation für das zweite Steuerelement aus, wobei Sie als Ziel die bereits vorhandene
Methode verwenden. Achten Sie darauf, dass die gesamte Methode blau unterlegt wird –
dann hat Xcode erkannt, dass Sie nicht eine Action in der Methode einfügen möchten (das
funktioniert nicht), sondern dass Sie das Steuerelement mit der vorhandenen Methode ver-
bindenmöchten.
Naturgemäß müssen Sie die Methode nun ein wenig modifizieren: Erst mit einer Auswer-
tung des sender-Parameters können Sie erkennen, welches Steuerelement den Aufruf der
Methode ausgelöst hat. Wenn Sie beispielsweisemehrere Buttonsmit einerMethode verbun-
den haben, können Sie wie folgt den Text des Buttons ausgeben:
@IBAction func btnAction (_ sender : UIButton ) {print(sender .currentTitle !)
}
385
�
�
“buch” — 2017/10/6 — 8:49 — page 386 — #382
�
�
�
�
�
�
15 Hello iOS-World!
Ein Outlet für mehrere Steuerelemente (Outlet Collections)
Auch der umgekehrte Fall ist möglich – Sie können mehrere Steuerelemente über ein Outlet
ansprechen. Genau genommen handelt es sich dann nicht mehr um ein einfaches Outlet,
sondernumeineOutlet Collection. Dazumarkieren Sie das erste Steuerelement, ziehen esmit
(ctrl)-Drag in den Controller-Code und wählen Connection = Outlet Collection (siehe
Abbildung 15.7). Xcode erzeugt anstelle einer einfachen Outlet-Variablen nun ein Array:
@IBOutlet var allButtons : [UIButton ]!
In der Folge verbinden Sie auch die weiteren Steuerelemente durch (ctrl)-Drag mit die-
sem Array. Xcode ist leider nicht in der Lage, mehrere markierte Steuerelemente auf einmal
zu verbinden. Im Code können Sie nun unkompliziert Schleifen über alle so verbundenen
Steuerelemente bilden.
Abbildung 15.7 Dialog zum Einrichten einer Outlet-Collection
Actions oder Outlets umbenennen
Wenn Sie im Code Actions oder Outlets einfach einen neuen Namen geben, funktioniert Ihre
App nichtmehr. Xcodemerkt sich die Verknüpfung zu IhrenMethoden bzw. Eigenschaften in
Form von Zeichenketten. Nach der Umbenennung ist dann keine korrekte Zuordnung mehr
möglich.
Deswegen müssen Sie zum Umbenennen das neu in Xcode 9 verfügbare Kommando Refac-
tor • Rename verwenden. Sie können dieses Kommando entweder nach einem Kontext-
menüklick auf den Variablennamen oder über das Editor-Menü ausführen. Xcode zeigt nun
automatisch alle Stellen im Code und im Storyboard an, wo die Umbenennung wirksamwird
(siehe Abbildung 15.8).
Zuordnung zwischen Steuerelementen und Actions/Outlets ergründen
Eigenschaften und Methoden, die mit Steuerelementen verbunden sind, werden im Code-
Editor durch einen runden Punkt gekennzeichnet. Der Editor verrät aber leider nicht, zu
welchem Steuerelement die Verbindung besteht.
386
�
�
“buch” — 2017/10/6 — 8:49 — page 387 — #383
�
�
�
�
�
�
15
15.4 Actions und Outlets für Fortgeschrittene
Abbildung 15.8 Umbenennung einer Outlet-Variablen
Wesentlich hilfreicher ist Xcode in die umgekehrte Richtung: Wenn Sie im Storyboard-Editor
das betreffende Steuerelement mit der rechten Maus- oder Trackpad-Taste anklicken, zeigt
ein Kontextmenü alle Zuordnungen zu Actions oder Outlets (siehe Abbildung 15.9). Dort kön-
nen Sie die Action- oder Outlet-Verknüpfung löschen, die Sie nicht mehr brauchen.
Abbildung 15.9 Die rechteMaus- oder Trackpad-Taste führt in eine Liste aller Actions und Outlets
eines Steuerelements.
387
�
�
“buch” — 2017/10/6 — 8:49 — page 388 — #384
�
�
�
�
�
�
15 Hello iOS-World!
Fehlermeldung »unrecognized selector«
Wenn Ihre App mit der nicht besonders aussagekräftigen Fehlermeldung unrecognized selec-
tor abstürzt, liegt dies in der Regel daran, dass die Zuordnung zwischen einem Steuerelement
und demOutlet oder der Action verloren gegangen ist – z. B. weil Sie einen Action-Methoden-
namen direkt geändert haben, anstatt Refactor • Rename auszuführen.
Abhilfe: Löschen Sie im Kontextmenü die Verbindung (siehe Abbildung 15.9), und richten Sie
diese dannmit einem (ctrl)-Drag neu ein.
Steuerelemente kopieren
Wenn Sie Steuerelemente mit (Š)+(C) und (Š)+(V) kopieren, werden dabei alle möglichen un-
sichtbaren Attribute und Eigenschaftenmitkopiert, unter anderem zugeordnete Actions. Oft
erspart Ihnen das eine wiederholte Einstellung dieser Merkmale, aber mitunter führt dieses
Verhalten zu unerwartetenNebenwirkungen. EinKlick auf das Steuerelementmit der rechten
Maus- oder Trackpad-Taste offenbart alle zugeordneten Outlets und Actions.
15.5 Layout optimieren
Es ist Ihnen sicher aufgefallen, dass das Layout unserer App, also die Anordnung und Größe
der Steuerelemente, verbesserungswürdig ist. Die Größe der Steuerelemente ist willkürlich.
Wenn Sie die App in verschiedenen iOS-Geräten ausprobieren, werden Sie feststellen, dass
teilweise große Teile des Bildschirms ungenutzt bleiben, während das Textfeld bei anderen
Geräten womöglich sogar abgeschnitten und unvollständig dargestellt wird. Besonders deut-
lich werden die Layoutdefizite, wenn Sie den iOS-Simulator mit Hardware • Rotate in das
Querformat drehen.
Wie würden unsere Layoutwünsche denn aussehen?
Der Button soll ohne unnötige Abstände links oben im Bildschirm dargestellt werden.
Das Textfeld soll darunter platziert sein.
Es soll die gesamte verbleibende Größe des Bildschirms nutzen.
Es soll seine Größe bei einer Drehung des Geräts automatisch anpassen.
Momentan wird unser Programm diesen Wünschen deswegen nicht gerecht, weil wir die
Position und Größe der Steuerelemente absolut festgelegt haben. Wir haben die Steuer-
elemente im View weitgehend nach Gutdünken platziert.
Layoutregeln
Die Lösung, die Xcode bzw. eigentlich das UIKit (also das Framework zur iOS-Programmie-
rung) hierfür anbietet, heißt Layoutregeln (Constraints). Sie können also für jedes Steuer-
388
�
�
“buch” — 2017/10/6 — 8:49 — page 389 — #385
�
�
�
�
�
�
15
15.5 Layout optimieren
element Regeln aufstellen, die das Steuerelement einhalten soll. Das UIKit bemüht sich dann,
in Abhängigkeit von der gerade vorliegenden Form und Größe des iOS-Geräts, allen Regeln
gerecht zu werden. Beispiele für derartige Regeln sind:
Der horizontale Abstand zwischen dem Steuerelement A und seinem nächstgelegenen
linken oder rechten Nachbarn soll 8 Punkte betragen. Bei Retina-Geräten mit doppelter
Auflösung entspricht das 16 Pixeln.
Der vertikale obere Abstand zwischen dem Steuerelement A und dem Bildschirmrand soll
16 Punkt betragen.
Steuerelement A soll genauso breit sein wie Steuerelement B.
Steuerelement A soll innerhalb seines Containers vertikal und/oder horizontal zentriert
werden.
Die linken Ränder der Steuerelemente A, B und C sollen in einer Linie verlaufen.
Wenn wir also erreichen möchten, dass die Steuerelemente der Hello-World-App wie oben
formuliert angeordnet werden, müssen wir nur die entsprechenden Regeln formulieren. Mit
etwas Erfahrung gelingt dies rasch; gerade Einsteiger in die iOS-Programmierung scheitern
aber oft an der damit verbundenen Komplexität.
Glücklicherweise macht Xcode es sehr einfach, Layoutregeln zu testen, ohne die App jedes
Mal neu starten zu müssen: Dazu verändern Sie einfach in der Fußleiste von Xcode das iOS-
Device und seine Orientierung. Xcode passt dann die View an die neue Gerätegröße an, und
Sie erkennen sofort, ob die Steuerelemente wunschgemäß platziert werden.
Layoutregeln für den »Hello-World«-Button
Eine detaillierte Erklärung der Layoutregeln erhalten Sie in Abschnitt 16.5, »Auto Layout«.
An dieser Stelle möchte ich Ihnen nur rezeptartig erklären, wie Sie das Layout der Hello-
World-App korrekt einstellen. Um die Layoutregeln einzustellen, verwenden Sie fünf Buttons,
die sich rechts unten im Editor befinden (siehe Abbildung 15.10). Die ersten beiden Buttons
(Update Frames und Embed in Stack) lösen unmittelbar Aktionen aus. Die anderen drei
führen in kleine Dialoge bzw. Menüs, in denen Sie Einstellungen vornehmen können.
Abbildung 15.10 Die winzigen Layout-Buttons befinden sich rechts unten im Storyboard-Editor.
389
�
�
“buch” — 2017/10/6 — 8:49 — page 390 — #386
�
�
�
�
�
�
15 Hello iOS-World!
Beginnen Sie mit dem Button Hello World!: Nachdem Sie den Button beschriftet haben,
platzieren Sie ihn links oben im View Controller, wobei Sie Abstände zu den Rändern einhal-
ten. Dabei helfen Orientierungslinien, an denen der Button beim Verschieben einrastet. Den
rechten Rand des Buttons ziehen Sie bis knapp an den rechten Rand des View Controllers.
Auch dort rastet der Button ein. Damit nutzt der Button die gesamte Breite, hält dabei aber
einen kleinen optischen Abstand ein und lässt die obere Zeile des iPhones oder iPads frei.
Damit der Text dennoch links ausgerichtet wird, stellen Sie die Textausrichtung im Attribut-
inspektor auf Alignment = Left.
Während der Button noch immer ausgewählt ist, klicken Sie nun auf den Layout-Button
Add New Constraints. Damit erscheint der gleichnamige Dialog zur Einstellung diver-
ser Abstände (siehe Abbildung 15.11). Dort klicken Sie zuerst die Verbindungsstege für die
Abstände nach oben, nach links und nach rechts an, sodass diese Stege durchgängig rot ange-
zeigtwerden. Alle drei Abstandswerte sollten jeweils denWert0 enthalten. Standardmäßig ist
die Option Constrain tomargins aktiv. Sie bewirkt, dass diese Abstände relativ zu den vom
jeweiligen iOS-Gerät vorgegebenen Rahmen (Guide Lines) gerechnet werden. Zuletzt schlie-
ßen Sie den Dialogmit dem Button Add 3 Constraints. Damit werden drei neue Regeln zur
Positionierung des Buttons festgelegt.
Abbildung 15.11 Layoutregeln für den Hello-World-Button festlegen
Die neuen Layoutregeln ändern nichts an der aktuellen Position des Buttons. Sie können
nun aber versuchen, in der Leiste View as iPhone xxx ein anderes Gerät auszuwählen.
Aufgrund der Layoutregeln wird sich der Button automatisch an die geänderten Platzverhält-
nisse anpassen.
390
�
�
“buch” — 2017/10/6 — 8:49 — page 391 — #387
�
�
�
�
�
�
15
15.5 Layout optimieren
Interessant ist das Verhalten, wenn Sie den Button aus seiner durch die Regeln festgeleg-
ten Position hinausziehen. Nun zeigen orange strichlierte Linien an, wo der Button bei der
Programmausführung platziert wird (siehe Abbildung 15.12). Außerdem visualisieren zwei
orange Stege die von Ihnen aufgestellten Regeln. Aus den Zahlenwerten geht hervor, um
wie viele Punkte das Element aktuell falsch positioniert ist. Um den Button den Regeln ent-
sprechend wieder korrekt zu positionieren, klicken Sie auf den ersten Layout-Button Update
Frames.
Abbildung 15.12 Wenn die Position eines Steuerelements aktuell nicht den Layoutregeln entspricht,
zeigt der Storyboard-Editor an, wo das Element zur Laufzeit platziert wird.
Layoutregeln für das Textfeld
Nun ist das Textfeld an der Reihe. Der erste Schritt besteht wieder darin, dass Sie das Steuer-
element in der Ansicht so platzieren, wie es auch zur Laufzeit angeordnet werden soll. In
diesem Fall bietet es sich an, das Steuerelement bündig unterhalb des Buttons anzuord-
nen und dann die Größe so einzustellen, dass es – wieder unter Einhaltung eines kleinen
Abstands – den ganzen View-Controller ausfüllt. Das fällt nicht schwer, weil die Begrenzungs-
linien des Steuerelements automatisch an den richtigen Stellen einrasten.
Nun klicken Sie neuerlich auf den Button Add New Constraints. Dort stellen Sie die folgen-
den Abstände ein (siehe Abbildung 15.13):
Links: 0 Punkte. Dieser Abstand gilt wegen derOptionConstrain tomargins relativ zum
Standardrahmen.
Oben: 8 Punkte. Dieser Abstand wird relativ zum nächstgelegenen Steuerelement gerech-
net, in diesem Fall also zum Button.
Rechts: 0 Punkte. Dieser Abstand gilt wieder relativ zum Standardrahmen.
Unten: 8 Punkte. Auch dieser Abstand gilt relativ zum Standardrahmen. Dieser sieht nach
unten aber keinen Rand vor. Damit das Textfeld von allen Rändern gleich weit entfernt ist,
muss hier ein etwas größerer Wert angegeben werden.
Add 4 Constraints beendet die Eingabe und fügt vier Regeln hinzu. Damit sollten beide
Steuerelemente korrekt angeordnet sein. Ändern Sie nun in der Fußleiste des Storyboard-
Editors das iOS-Device und die Ausrichtung. Der Ort und die Größe der Steuerelemente sind
nun immer korrekt an die jeweilige Bildschirmgröße angepasst (siehe Abbildung 15.14).
391
�
�
“buch” — 2017/10/6 — 8:49 — page 392 — #388
�
�
�
�
�
�
15 Hello iOS-World!
Abbildung 15.13 Layoutregeln für das Textfeld
Embed-in-Stack-Aktion rückgängig machen
Die Buttons Align, AddNewConstraints und Resolve Auto Layout Issues führen jeweils
in Dialoge oder Menüs, in denen Sie die jeweilige Aktion auswählen bzw. bestätigen. Es
besteht also keine Gefahr, dass Sie irrtümlich eine Aktion durchführen, die Sie nicht wollen.
Ganz anders verhält sich der zweite Layout-Button Embed in Stack: Sofern im Storyboard-
Editor gerade ein Steuerelement markiert ist bzw. mehrere Steuerelemente markiert sind,
werden diese in eine Stack-View verpackt, also in einen Container, der bei der Anordnung der
Steuerelemente helfen soll. Diese Aktion erfolgt sofort, ohne Rückfrage und ohne visuelles
Feedback, also oft ungewollt und unbemerkt.
Ungewollte Stack-View-Verschachtelungen erkennen Sie, wenn Sie im Storyboard-Editor die
Seitenleiste Document Outline aktivieren. Sie zeigt die hierarchische Struktur aller Steuer-
elemente im Storyboard-Editor. Dort können Sie bei Bedarf die betroffenen Steuerelemente
aus der Stack-View herausziehen (siehe Abbildung 15.15). Danach können Sie die Stack-Views
in der Seitenleiste anklicken und löschen.
392
�
�
“buch” — 2017/10/6 — 8:49 — page 393 — #389
�
�
�
�
�
�
15
15.5 Layout optimieren
Abbildung 15.14 Die Hello-World-App im iPhone-8-Querformat
Abbildung 15.15 Ungewollte Stack-View-Verschachtelungen auflösen
393
�
�
“buch” — 2017/10/6 — 8:49 — page 394 — #390
�
�
�
�
�
�
15 Hello iOS-World!
Stack-Views richtig einsetzen
Stack-Views sind ein durchaus nützliches Feature, das dabei hilft, allzu komplizierte Layout-
regeln zu vermeiden. Den richtigen Umgang mit Stack-Views erläutere ich Ihnen in
Abschnitt 16.7.
Die Document-Outline-Seitenleiste verstehen
Die Document-Outline zeigt, wie die Steuerelemente (Views) innerhalb eines View-Control-
lers ineinander verschachtelt sind (siehe Abbildung 15.15), und sie hilft dabei, das gewünschte
Element auszuwählen, wenn zwei Elemente übereinander platziert sind. Innerhalb des
Objektbaums erhält jedes Element standardmäßig einenNamen, der seiner Klasse entspricht
– z. B. View für ein UIView-Objekt. Bei einigen Steuerelementtypen, z. B. bei Buttons und Labels,
wird der dort eingetragene Text angezeigt – also Noch ein Button statt einfach Button.
Sie können imObjektbaumalleObjekte durch einfaches Anklickenumbenennen. Das ist dann
sinnvoll, wenn es mehrere gleichartige Objekte gibt, die Sie im Storyboard-Editor leichter
identifizieren wollen. Beachten Sie aber, dass die Objektnamen in der Document-Outline-
Seitenleiste ausschließlich für den Storyboard-Editor von Xcode gelten!
Im Code Ihrer View-Controller-Klasse haben Sie keine Möglichkeit, den Namen festzustellen,
den Sie einem Objekt in der Outline-Seitenleiste gegeben haben. Sie können zur Identifizie-
rung von Steuerelementen im Code auf die tag-Eigenschaft zurückgreifen. In dieser auch in
Xcode zugänglichen Eigenschaft können Sie allerdings nur eine ganze Zahl speichern. Eine
zweite Möglichkeit besteht darin, eine eigene Klasse mit einer neuen Eigenschaft zu definie-
ren. Ein Beispiel dafür finden Sie in Abschnitt 20.3, »Focus Engine«.
Wenn es Probleme gibt
Der Umgang mit Layoutregeln ist schwierig und führt häufig dazu, dass sich Xcode über feh-
lende oder über zueinander im Konflikt stehende Regeln beklagt. In Abschnitt 16.5, »Auto
Layout«, folgt eine Menge weiterer Details zu diesem Thema. Bis dahin vertröste ich Sie hier
mit einigen Tipps:
Sobald Sie eine Regel für ein Steuerelement festlegen, müssen Sie die Größe und Position
des Steuerelements vollständig durch Regeln bestimmen. Mit anderenWorten: Solange es
gar keine Regeln gibt, betrachtet Xcode das Steuerelement als unbestimmt und meckert
nicht. Sobald Sie aber beginnen, Regeln festzulegen, müssen Sie dies so tun, dass keine
Unklarheiten verbleiben.
Die Anzahl der erforderlichen Regeln ist nicht bei jedem Steuerelement gleich. Manche
Steuerelemente können ihre optimale Größe aus dem Inhalt selbst ermitteln. Das trifft
z. B. bei einem Button zu. Hier reichen also Regeln, die die Position festlegen. Bei anderen
394
�
�
“buch” — 2017/10/6 — 8:49 — page 395 — #391
�
�
�
�
�
�
15
15.6 Textgröße mit einem Slider einstellen
Steuerelementen müssen Sie die Größe selbst einstellen – und das erfordert zwei weitere
Regeln.
Sie können vorhandene Regeln nicht ohne Weiteres ändern. Die Dialoge Add New Align-
ment Constraints bzw. Add New Constraints ersetzen bzw. verändern nicht vorhan-
dene Regeln, sondern definieren zusätzliche Regeln. Das führt oft zu Regeln, die sich
widersprechen. EinenÜberblick über alle Regeln erhalten Sie, wenn Sie die Seitenleiste des
Storyboard-Editors einblenden (Editor • ShowDocumentOutline). Dort finden Sie eine
Liste aller Constraints. Wenn Sie eine der Regeln anklicken, wird die betreffende Regel
markiert.
Bei kleinen Projekten ist es bei Problemen oft am einfachsten, alle Regeln zu löschen und
noch einmal von vorne zu beginnen. Dazu klicken Sie auf den Button Resolve Auto Lay-
out Issues und führen All Views in View Controller • Clear Constraints aus.
In Xcode 9 hat es einige Änderungen bei den Layoutregeln gegeben. Beispielsweise zeigt
Xcoden nun eine Warnung an, wenn Sie die Breite von Steuerelementen mit Text fixieren
oder wenn Sie bei einem Button oder Label nur den linken Rand, nicht aber den rechten
einstellen.
In beiden Punkten war Xcode 8 toleranter. Xcode 9 zwingt hier zu neuen Arbeitstechni-
ken, z. B. zur vermehrten Verwendung der Stack-View oder zur beidseitigen Fixierung der
horizontalen Ränder. Anfänglich ist das lästig, längerfristig sollten die geänderten Vor-
gehensweisen aber robuster sein und vermeiden, dass die Änderung der Beschriftung
womöglich zu abgeschnittenen Texten führt.
15.6 Textgrößemit einem Slider einstellen
Als letzte Erweiterung für das Programm fügen wir diesem nun neben dem Button noch
einen Slider hinzu, mit dem die Schriftgröße des Textfelds verändert werden kann (siehe
Abbildung 15.16).
Das Slider-Steuerelement hinzufügen
Sie finden das Steuerelement in der Xcode-Objektbibliothek unter dem Namen Slider. Fügen
Sie es in den View-Controller ein, und platzieren Sie es so, dass es am rechten und oberen
Rand einrastet, wobei Sie dieselben Abstände wie bei den anderen Steuerelementen einhal-
ten. Mit Add Align Constraints fixieren Sie die Abstände nach oben und nach rechts (die
Werte sollten jeweils 0 lauten) sowie die Breite des Steuerelements (114 in Abbildung 15.17,
aber Sie können natürlich auch eine andere Breite wählen). Die Werte für die Abstände nach
rechts und nach unten (174 bzw. 11 in Abbildung 15.17) spielen keine Rolle, weil die entspre-
chenden Regeln nicht aktiviert werden.
395
�
�
“buch” — 2017/10/6 — 8:49 — page 396 — #392
�
�
�
�
�
�
15 Hello iOS-World!
Abbildung 15.16 Die erweiterte Hello-World-App mit einem Slider zur Einstellung der Textgröße,
diesmal im Simulator im Querformat ausgeführt
Abbildung 15.17 Layoutregeln für den Slider einstellen
Mit dem Slider soll die Textgröße in einem Bereich zwischen 12 und 30 Punkt verändert
werden. Dazuwählen Sie den Slider aus und stellen imAttributinspektor die folgenden Eigen-
schaften ein:
396
�
�
“buch” — 2017/10/6 — 8:49 — page 397 — #393
�
�
�
�
�
�
15
15.6 Textgröße mit einem Slider einstellen
Minimum: 12
Maximum: 30
Current: 16
Den Slider mit einer Methode verbinden
Damit sind die Arbeiten an der Oberfläche abgeschlossen, und wir können uns wieder der
Programmierung zuwenden: Öffnen Sie den Assistenz-Editor, und verschieben Sie den Slider
mit (ctrl) in den Code-Bereich. Die Verbindungsparameter stellen Sie wie folgt ein:
Connection = Action: Wir wollen in einer Methode auf das Verschieben des Sliders rea-
gieren.
Name: Die Methode muss einen Namen bekommen. Ich habe mich für sliderMove ent-
schieden.
Type = UISlider: In der Methode müssen wir die aktuelle Position des Sliders herausfin-
den. Deswegen soll die Instanz des Sliders an die Methode übergeben werden.
Event = Value Changed: Die Defaulteinstellung passt hier gut – andere Ereignisse inter-
essieren uns nicht.
Arguments = Sender: Damit wird die Instanz des Sliders als Parameter an die Methode
übergeben. Den Datentyp des Parameters haben wir ja bereits mit UISlider festgelegt.
Zu Testzwecken bauenwir in dieMethode vorerst nur die print-Funktion ein, um eine Verän-
derung des Sliders in Xcode verfolgen zu können. Uns interessiert die value-Eigenschaft, die
die Slider-Position im eingestellten Wertebereich als Fließkommazahl liefert:
// wird bei jeder Slider -Bewegung ausgef ührt@IBAction func sliderMove (_ sender : UISlider ) {
// Testausgabe im Debug -Fensterprint(sender .value)
}
Jetzt geht es nur noch darum, die Schrift des Textfelds entsprechend zu verändern. Dazu
lesen wir mit textView.font? die aktuelle Font-Instanz aus, bilden daraus mit der Methode
withSize eine neue Instanz in der gewünschten Größe und weisen diese der font-Eigenschaft
des Textfelds wieder zu. Da fontWithSize einen CGFloat-Parameter erwartet, muss die Fließ-
kommazahl von sender.value in den CGFloat-Typ umgewandelt werden. CGFloat ist auf
32-Bit-Architekturen ein Float, auf 64-Bit-Architekturen aber ein Double.
// Schriftgr öße im Textfeld einstellen@IBAction func sliderMove (_ sender : UISlider ) {
textView .font = textView .font?.withSize (CGFloat (sender .value))}
397
�
�
“buch” — 2017/10/6 — 8:49 — page 398 — #394
�
�
�
�
�
�
15 Hello iOS-World!
15.7 Apps auf dem eigenen iPhone/iPadausführen
Den iOS-Simulator in Ehren, aber natürlich wollen Sie Ihre Programme auch auf »richti-
ger« Hardware testen. Während dazu früher ein kostenpflichtiger Apple-Developer-Account
erforderlich war, ist das Ausführen eigener Apps auf eigenen Geräten mittlerweile kostenlos
möglich (Free Provisioning). Dazu verbinden Sie im Dialog Preferences •Accounts Xcode
mit Ihrer Apple-ID. Außerdem muss Ihr iOS-Gerät durch ein USB-Kabel mit dem Computer
verbunden sein. Nach diesen Vorbereitungsarbeiten können Sie das iOS-Gerät in der Symbol-
leiste von Xcode anstelle eines Simulators auswählen.
Wenn Sie (Š)+(R) drücken bzw. den Run-Button anklicken, überträgt Xcode die Hello-World-
App auf das angeschlossene iPhone oder iPad und startet sie dort. Das gelingt nur, wenn Ihr
Smartphone oder Tablet entsperrt ist. Bemerkenswert ist, dass trotz der externen Programm-
ausführung die Debugging-Funktionen von Xcode aktiv bleiben. Wenn Sie also z. B. einen
Breakpoint setzen, wird die App an dieser Stelle angehalten. Sie können inXcodeden Zustand
der Variablen ergründen und das Programmdann wieder fortsetzen.
Die App bleibt jetzt auf dem iPhone oder iPad. Sie kann dort losgelöst von Xcode ausgeführt
werden – dann aber ohne Debugging-Möglichkeiten. Sie können Ihre App wie jede andere
installierte App problemlos wieder löschen, indem Sie sie zuerst länger anklicken und dann
auf das x-Symbol drücken.
Einschränkungen des Free Provisioning
Apple bezeichnet das Verfahren zum Ausführen von Apps auf iOS-Geräten ohne Apple-
Developer-Account als Free Provisioning. Dabei gibt es aber Einschränkungen: Der Test
von einigen Zusatzfunktionen erfordert weiterhin einen kostenpflichtigen Apple-Developer-
Account. Das gilt z. B. für In-App-Käufe, den Datenaustauschmit der iCloud oder die Verwen-
dung der Apple-Pay-Funktionen.
App-Ausführung ohne Kabel
Eine praktische Neuerung von Xcode 9 besteht darin, dass Testgeräte nicht mehr ständig
über ein USB-Kabel mit Ihrem Computer verbunden bleiben müssen. Um diesen Kom-
munikationsmechanismus zu konfigurieren, muss das Gerät aber weiterhin einmalig per
Kabel verbunden werden. Anschließend führen Sie in Xcode Window•Devices and Simu-
lators aus, wählen Ihr Gerät und aktivieren die Option Connect via Network (siehe
Abbildung 15.18).
398
�
�
“buch” — 2017/10/6 — 8:49 — page 399 — #395
�
�
�
�
�
�
15
15.7 Apps auf dem eigenen iPhone/iPad ausführen
Abbildung 15.18 Xcode 9 erlaubt (endlich) die App-Entwicklung ohne Kabel.
Apple Developer Program
Bevor Sie eine App in den App Store hochladen können, müssen Sie Ihre App speziell
vorbereiten und signieren (siehe Kapitel 31, »App Store und Co.«). Das ist nurmit dem Schlüs-
selsystemdes Apple Developer Programmöglich. DieMitgliedschaft hat auch andere Vorteile
– etwa den unkomplizierten Zugang zu Beta-Versionen von iOS, macOS und Xcode, den
Zugang zu Entwicklerforen etc.:
https://developer.apple.com/programs
Dieses Service-Paket lässt sich Apple mit zurzeit 100 EUR pro Jahr bezahlen. Im Gegensatz zu
früher, als es verschiedene Entwicklerprogramme für iOS, macOS und Safari gab, hat Apple
diese Programme nun zu einem einzigen verbunden.
Eine vorhandene oder eine neue Apple-ID verwenden?
Bevor Sie sich dem Entwicklerprogramm anschließen, müssen Sie sich überlegen, welche
Apple-ID Sie hierfür verwenden. Normalerweise spricht nichts gegen Ihre gewöhnliche Apple-
ID. Sollten Sie diese ID aber schon imRahmen von iTunes Connect zumVerkauf vonMusik oder
Büchern nutzen, dann benötigen Sie eine zweite Apple-ID für das Entwicklerprogramm.
Sie können dem Entwicklerprogramm wahlweise als Einzelperson oder als Team beitreten.
Als Einzelperson benötigen Sie dazu lediglich eine Kreditkarte. Nach Abschluss des Bezahl-
prozesses kann es ein paarMinuten dauern, bis Ihr Entwicklerzugang freigeschaltet wird und
Sie die entsprechendeWelcome-E-Mail erhalten.
399
�
�
“buch” — 2017/10/6 — 8:49 — page 400 — #396
�
�
�
�
�
�
15 Hello iOS-World!
Nun können Sie in denXcode-Einstellungen imDialogblattAccountsmitAddApple ID Ihre
Apple-ID mit Xcode verbinden. Von dort gelangen Sie mit View Details in einen weiteren
Dialog, in dem Sie Schlüssel generieren können (siehe Abbildung 15.19). Vorerst benötigen
Sie lediglich einen Schlüssel zur iOS-Entwicklung (also den Eintrag iOS Development).
Abbildung 15.19 Verwaltung der Schlüssel des iOS-Entwicklerprogramms in Xcode
Nach diesen Vorbereitungsarbeiten wird jedes Gerät, auf dem Sie via Xcode eigene Apps
ausführen, in das Entwicklungsprogramm aufgenommen. Insgesamt dürfen Sie pro Jahr
maximal 500 Geräte mit Ihrem Konto verbinden: 100 iPhones, 100 iPods, 100 iPads sowie
je 100 Apple-TV- und Apple-Watch-Geräte. Einen Überblick über alle mit Ihrem Konto ver-
bundenen iOS-Geräte finden Sie auf der Webseite des Entwicklerprogramms:
https://developer.apple.com/account/ios/device
15.8 Komponentenund Dateien eines Xcode-Projekts
Wenn Sie in Xcode ein neues iOS-Projekt starten, besteht dieses standardmäßig schon aus
einerMengeDateien (sieheAbbildung 15.20) – und dabei bleibt es nicht. Dieser Abschnitt gibt
Ihnen einen kurzen Überblick darüber, welche Datei welchen Zweck hat. Detaillierte Erläute-
rungen zu vielen Dateien folgen dann in den weiteren Kapiteln.
AppDelegate.swift enthält Code zur Verarbeitung von Ereignissen des App-Lebenszyklus
(siehe Abschnitt 16.4, »Phasen einer iOS-App«).
400
�
�
“buch” — 2017/10/6 — 8:49 — page 401 — #397
�
�
�
�
�
�
15
15.8 Komponenten und Dateien eines Xcode-Projekts
LaunchScreen.storyboard enthält eine spezielle Ansicht der App, die während des Starts
als eine Art Willkommensdialog angezeigt wird (siehe Abschnitt 31.1, »iOS-Artwork (Icons,
Launch Screen)«).
Assets.xcassets dient als Container für die Bilddateien der App. Dazu zählen neben dem
Icon der App auch alle anderen Bitmaps, die Sie irgendwann anzeigen möchten. Die Be-
sonderheit von Xcassets-Dateien besteht darin, dass Bitmaps in mehreren Auflösungen
gespeichert werden können. Bei der Ausführung verwendet iOS dann automatisch die
Datei, die am besten zum Display des iOS-Geräts passt (siehe Abschnitt 16.10, »Image-
Views und Xcassets«, und Abschnitt 31.1, »iOS-Artwork (Icons, Launch Screen)«).
Info.plist enthält diverse Projekteinstellungen in Form einer sogenannten Property List
(Key-Value-Datei).
Main.storyboard beschreibt das Aussehen und die Eigenschaften der Ansichten (View-
Controller) einer App.
ViewController.swift enthält den Controller-Code der ersten Ansicht des Storyboards.
Für jede weitere Ansicht im Storyboard müssen Sie in der Regel eine weitere Swift-Datei
hinzufügen, die eine von UIViewController abgeleitete Klasse definiert (siehe Kapitel 17,
»iOS-Apps mit mehreren Ansichten«).
Abbildung 15.20 Überblick über die Code-Dateien im Projektnavigator von Xcode
Dateien im Navigator verschieben
Sie können die Dateien des Projekts im Navigator verschieben und in Gruppen bzw. Ver-
zeichnisse gliedern. Es spielt für Xcode keine Rolle, in welchem Verzeichnis die Dateien sich
befinden. Xcode findet in jedem Fall alle zum Kompilieren erforderlichen Dateien. Die Organi-
sation ist lediglich ein Hilfsmittel für Sie, um einen besseren Überblick zu wahren.
Eine Neuerung in Xcode 9 besteht darin, dass die im Navigator angezeigten Gruppen
tatsächlich in Form von Verzeichnissen im Dateisystem abgebildet werden. In älteren Xcode-
Versionenwar die Gruppenzuordnung virtuell, was mitunter Verwirrung stiftete.
401
�
�
“buch” — 2017/10/6 — 8:49 — page 402 — #398
�
�
�
�
�
�
15 Hello iOS-World!
Weitere Dateien
Bei »richtigen« Apps, die also nicht nur Test- oder Beispielcharakter haben, kommen zu den
anfänglich vorhandenen Dateien zumeist viele weitere Dateien hinzu:
Weitere Swift-Code-Dateien verbinden Objekte Ihrer Oberfläche mit eigenen Klassen bzw.
bilden die innere Logik Ihres Programms ab, also das Datenmodell gemäß des MVC-
Musters (siehe Abschnitt 16.1, »Model-View-Controller (MVC)«).
Zusätzliche Lokalisierungsdateien enthalten Zeichenketten für alle Sprachen, in denen die
App später ausgeführt werden kann (siehe Abschnitt 31.4, »Mehrsprachige Apps«).
Ja nach Zielsetzung der App sind außerdem Text-, XML-, HTML-, Datenbank- sowie Audio-
und Video-Dateien erforderlich. Diese Dateien werden zusammen mit der App ausgelie-
fert (Bundle-Dateien).
Test- und Produktgruppe
Neben der eigentlichen Projektgruppe, deren Namemit dem Projektnamen übereinstimmt,
kann ein Projekt bis zu drei weitere Gruppen aufweisen:
projektnameTests und projektnameUITests enthält Code und Einstellungen zum automati-
sierten Test Ihres Projekts. Das zugrunde liegende XCTest-Framework hat eine ähnliche
Zielsetzung wie Unit Tests in anderen Programmiersprachen. In diesem Buch gehe ich
darauf allerdings nicht ein.
Products enthält das kompilierte Programm. Bei der iOS-App-Entwicklung werden die hier
enthaltenenDateien aber selten benötigt, weil die Ausführung vonApps durchXcodeauto-
matisiert ist und eine Weitergabe von Apps an andere Benutzer nur über den App Store
möglich ist.
402
�
�
“buch” — 2017/10/6 — 8:49 — page 1193 — #1189
�
�
�
�
�
�
40
Kapitel 40
Breakout
Breakout ist ein klassisches Spielhallenspiel. Es geht darum,mit einemBall rechteckige Steine
(Bricks) abzuschießen. Es ist Aufgabe des Spielers, denBallmit einemSchläger (Paddle) in dem
nach unten offenen Spielfeld zu halten. Die erste Version des Spiels wurde 1976 von Atari
produziert, wobei die Spiellogik nicht durch ein Programm, sondern in Hardware realisiert
wurde.
Abbildung 40.1 Das Spiel »Breakout«
Breakout hat übrigens schon seit Langem mit Apple zu tun: Steve Jobs, der damals für Atari
arbeitete, überließ es SteveWozniak, einen Prototyp für das Spiel zu bauen, bezahlte ihn dafür
aber nur schäbig. Nichtsdestotrotz gründeten die beiden wenig später Apple.
https://de.wikipedia.org/wiki/Breakout_(Computerspiel)
1193
�
�
“buch” — 2017/10/6 — 8:49 — page 1194 — #1190
�
�
�
�
�
�
40 Breakout
Aus Entwicklersicht ist Breakout ein dankbares Beispiel für den Einstieg in die Spieleprogram-
mierung (siehe auch Kapitel 28, »SpriteKit«): Die hier präsentierte Version umfasst nur rund
250 Zeilen, wenn man den Begleit-Code wegrechnet (CGOperators.swift, GameViewControl-
ler.swift etc.).
40.1 Programmaufbau
Die App wurde aus dem Standard-Template für iOS-SpriteKit-Spiele entwickelt. Die wichtigs-
ten Dateien sind:
GameScene.sks enthält die farbige Hintergrund-Bitmap für die einzige Spielszene.
GameScene.swift enthält den Großteil des Codes.
GameViewController.swift lädt und skaliert die GameScene-Datei.
CGOperators.swift enthält Methoden und Operatoren zum eleganteren Umgang mit
CGXxx-Strukturen (siehe Abschnitt 7.3, »CGFloat, CGPoint, CGSize und Co.«).
Das Spiel kannnur imVollbildmodus auf iPhones imPortrait-Modus gespielt werden. Andere
Geräteausrichtungen wurden in den Projekteinstellungen deaktiviert.
In Abbildung 40.1 ist Ihnen vielleicht aufgefallen, dass unterhalb des Schlägers relativ viel
freier Platz ist. Beim Test des Programms hat es sich als praktisch erwiesen, diesen Platz für
die Spielsteuerung frei zu lassen. Das ermöglicht die Steuerung des Schlägers mit einem Fin-
ger, ohne dass der Finger den Schläger verdeckt.
SpriteKit-Funktionen
Mit Ausnahme der Hintergrund-Bitmap verwendet die App keine Sprites, sondern nur Sha-
pes (also SKShapeNode-Objekte). Die App nutzt die Physik-Engine: einerseits zur Berechnung
der Flugbahn des Balls, andererseits zur Erkennung von Kollisionen mit Steinen. Diese wer-
den dann aus dem Spielfeld entfernt. Es gibt keine Aktionen (SKAction-Animationen).
Erweiterungsideen
In dem Spiel gibt es nur einen Level und nur ein Leben. Wenn der Ball aus demSpielfeld fliegt,
wird das Spiel bei der nächsten Berührung des Bildschirms neu gestartet. Wenn Sie Spaß an
der App haben, können Sie diverse Erweiterungen programmieren:
Counter mit Highscore-Speicherung
Verwaltungmehrerer Leben
Gestaltung weiterer Level, wobei die Steine abwechslungsreicher angeordnet werden kön-
nen (z. B. pyramidenförmig)
1194
�
�
“buch” — 2017/10/6 — 8:49 — page 1195 — #1191
�
�
�
�
�
�
40
40.2 Initialisierung
Level mit einem zweiten Ball, der zwischen Steinen eingeschlossen ist und erst aktiv wird,
wenn er »befreit« wird
nachrückende Steine (d. h., alle 30 Sekunden kommt oben eine zusätzliche Steinreihe
hinzu; noch vorhandene Steine werden nach unten verschoben)
zunehmende Ballgeschwindigkeit im Spielverlauf
40.2 Initialisierung
Im View-Controller wird die Spielszene geladen. Die Datei GameScene.sks enthält allerdings
nur den orangen Hintergrund des Spiels. In viewDidLoad wird die Größe der Szene eingestellt.
Dabei wird die Größe des jeweiligen iOS-Geräts aus dem SKView-Objekt übernommen.
Die eigentliche Initialisierung des Spiels erfolgt durch den Aufruf von setup in der Methode
viewDidAppear. Vielleicht fragen Sie sich, warum die Initialisierung nicht wie sonst üblich
bereits in viewDidLoad erfolgt. Das hat mit den Eigenheiten des iPhone X zu tun: Beim Ein-
richten des Spiels muss der oberste Display-Bereich unbenutzt bleiben. Wie viel Platz zur
Verfügung steht, kann aber erst mit dem Aufruf von viewDidAppear durch die Auswertung
der View-Eigenschaften layoutMargins bzw. safeAreaLayoutGuide ermittelt werden.
// Projekt ios-breakout , Datei GameViewController .swiftclass GameViewController : UIViewController {
// Szene aus GameScene .sks laden (oranger Hintergrund )var scene: GameScene ! = GameScene (fileNamed : "GameScene ")!
// die Initialisierung nur einmal durchf ührenvar setupDone = false
override func viewDidLoad () {super.viewDidLoad ()
// Initialisierung des Zufallszahlengeneratorssrand48 (Int(arc4random_uniform (100000000) ))
// Größe der Szene einstellen , Szene anzeigenlet skView = self.view as! SKViewscene.scaleMode = .aspectFillscene.size = skView .frame.sizeskView .presentScene (scene)
}
1195
�
�
“buch” — 2017/10/6 — 8:49 — page 1196 — #1192
�
�
�
�
�
�
40 Breakout
// wenn die Game -View zum ersten Mal erscheint , Initialisierung// durchf ührenoverride func viewDidAppear (_ animated : Bool) {
super .viewDidAppear (animated )if setupDone { return }scene .setup ()setupDone = true
}}
Control Center verbergen
Bei allen iOS-Gerätenmit Ausnahme des neuen iPhone X können Sie durch Hinaufstreichen
am unteren Bildschirmrand das Control Center öffnen. Ganz lässt sich das nicht verhindern
– aber wenn die Eigenschaft prefersStatusBarHidden den Zustand true zurückgibt, dann wird
ein versehentliches Öffnen des Control Centers zumindest wesentlich unwahrscheinlicher.
override var prefersStatusBarHidden : Bool {return true
}
Statusvariablen
GameScene.swift beginnt mit der Deklaration einiger Variablen, die die Eckdaten des Spiels
bzw. Spielfelds zusammenfassen:
// Projekt ios -breakout , Datei GameScene .swiftclass GameScene : SKScene {// Objekte
var paddle : SKShapeNode !var ball: SKShapeNode !var label = SKLabelNode (fontNamed : "AvenirNext -Bold")
var w: CGFloat = 0 // enthält Breite und Höhe des SKScene -var h: CGFloat = 0 // Objekts , wird in setup() eingestellt
// Spielstatusvar brickcounter = 0var status = GameStatus .waitForStart
}
Der aktuelle Spielstatus wird in status gespeichert. Diese Variable kann die Werte der folgen-
den Enumeration annehmen:
1196
�
�
“buch” — 2017/10/6 — 8:49 — page 1197 — #1193
�
�
�
�
�
�
40
40.2 Initialisierung
enum GameStatus {case waitForStart , running , won, lost
}
Für die Kollisionserkennung sind am Ende von GameScene.swift außerdem in der Struktur
PhysCategory einige UInt32-Konstanten definiert:
struct PhysCategory {static let none: UInt32 = 0static let ball: UInt32 = 1static let paddle : UInt32 = 2static let brick : UInt32 = 4static let frame : UInt32 = 8
}
Der gesamte weitere Code befindet sich innerhalb der Klasse GameScene.
Initialisierung der Spielszene
Die Initialisierung der Spielszene erfolgt in derMethode setup, die in der GameViewController-
Klasse durch viewDidAppear aufgerufen wird. Die sonst übliche Initialisierung in didMove(to:)
ist bei dieser App nicht möglich, weil zu diesem Zeitpunkt die Eigenschaften layoutMargins
bzw. safeAreaLayoutGuide noch nicht ausgewertet werden können. Diese Eigenschaften wer-
den aber gleichmehrfach benötigt, umdie Spielszene so zu gestalten, dass sie auch auf einem
iPhone X korrekt dargestellt wird:
Die Höhe des Spielbereichs (Variable h) wird im Vergleich zur Display-Größe um layout-
Margins.top reduziert, also um den Bereich des iPhone-X-Displays, der abgerundet ist. (Bei
anderen iPhone-Modellen enthält layoutMargins.top denWert 0. Das Spiel nutzt dann das
gesamte Display.)
Der Bereich, in dem sich der Ball frei bewegen kann, wird durch ein SKPhysicsBody-
Objekt eingegrenzt, das genau der Größe der sogenannten Safe Area entspricht (siehe
Abbildung 40.2).
Damit für die Spieler klar ist, wo der Ball oben reflektiert wird, wird der obere Display-
Bereich durch ein schwarzes SKShapeNode-Objekt dargestellt. In Abbildung 40.2 ist dieses
Objekt »wall« in grauer Farbe dargestellt. Bei anderen iPhone-Modellen entfällt dieses
Objekt, weil layoutMargins.top dann denWert 0 zurückgibt.
// Projekt ios-breakout , Datei GameScene .swiftfunc setup() {
w = self.frame.widthh = self.frame.height - self.view!.layoutMargins .top
1197
�
�
“buch” — 2017/10/6 — 8:49 — page 1198 — #1194
�
�
�
�
�
�
40 Breakout
// keine Gravitationself.physicsWorld .gravity = CGVector .zero
// zur Erkennung , wann ein Ball einen Stein trifftself.physicsWorld .contactDelegate = self
// Spielobjekte zusammenstellensetupBricks (rows: 6, cols: 6)setupPaddle ()setupBall ()setupText ()
// Ball einsperrenlet gameArea = self.view!.safeAreaLayoutGuide .layoutFrameself.physicsBody = SKPhysicsBody (edgeLoopFrom : gameArea )with(self.physicsBody !) {
$0.categoryBitMask = PhysCategory .frame$0.collisionBitMask = PhysCategory .ball$0.contactTestBitMask = PhysCategory .none
}
// optische Abgrenzung nach oben (für iPhone X)let wallrect = CGRect (x: 0,
y: h,width: w,height : self.view!.layoutMargins .top)
let wall = SKShapeNode (rect: wallrect )wall.fillColor = .blackwall.strokeColor = .blackwall.zPosition = 2self.addChild (wall)
}
Um bei der Einstellung der Eigenschaften des physikalischen Körpers die wiederholte Nen-
nung von brick.physicsBody! zu vermeiden, habe ich die with-Funktion verwendet, die
schon in Abschnitt 28.7, »Kollisionserkennung«, vorgestellt wurde. Sie ist am Ende von
GameScene.swift deklariert:
func with <T>(_ object: T, closure : (T) ->()) {closure (object )
}
1198
�
�
“buch” — 2017/10/6 — 8:49 — page 1199 — #1195
�
�
�
�
�
�
40
40.2 Initialisierung
Abbildung 40.2 Breakout auf einem iPhone X
Spielsteine einrichten
setupBricks richtet rows Zeilenmit jeweils cols Steinen ein. In brickcounter wird die Gesamt-
anzahl der Steine gespeichert. Die Variable hilft später dabei, das Spielende zu erkennen. Die
Steine werden je nach Zeile in unterschiedlichen Rottönen eingefärbt. Außerdem wird jeder
Stein durch name = "brick" benannt. Das ermöglicht es später, alle Steine unkompliziert aus
der Spielszene zu löschen.
isDynamic = false schließt aus, dass sich die Steine bewegen. Dieweiteren physicsBody-Eigen-
schaften bewirken, dass der Ball von den Steinen abprallt und dass die contactDelegate-
Methode didBegin bei jeder Kollision aufgerufen wird.
func setupBricks (rows: Int, cols: Int) {let brickw = w / CGFloat (cols+1)let brickh = brickw / 3brickcounter = rows * cols
1199
�
�
“buch” — 2017/10/6 — 8:49 — page 1200 — #1196
�
�
�
�
�
�
40 Breakout
for row in 1...rows {let brickColor =
SKColor .init(red: 0.7 + 0.3 * CGFloat (rows -row) / CGFloat (rows),green: 0.2 ,blue: 0,alpha: 1)
for col in 1...cols {let brick = SKShapeNode (rectOf :
CGSize (width: brickw * 0.95 , height : brickh * 0.7))brick.fillColor = brickColorbrick.strokeColor = brickColorlet x = brickw * CGFloat (col)let y = h - brickh * CGFloat (row+1)brick.position = CGPoint (x: x, y: y)brick.zPosition = 10brick.name = "brick"self.addChild (brick)
brick.physicsBody = SKPhysicsBody (rectangleOf : brick.frame.size)with(brick.physicsBody !) {
$0.isDynamic = false$0.categoryBitMask = PhysCategory .brick$0.contactTestBitMask = PhysCategory .ball$0.collisionBitMask = PhysCategory .ball
}} // Ende for col
} // Ende for row} // Ende func
Geschwindigkeitsüberlegungen
Die Anzahl der Spielsteine hat bei diesem Spiel einen großen Einfluss auf den Rechenauf-
wand. Bei jedem Framemuss SpriteKit für jeden Spielstein überprüfen, ob diesermit demBall
kollidiert. Das verursacht trotz der einfachen Objektformen einen verblüffend hohen CPU-
Aufwand.
Ich habe das Spiel auf einem iPhone 5S mit 16� 16 Steinen getestet. Dabei sank die Frame-
Rate auf ca. 20. Sie wurde auch nicht höher, als ich den Ball ins Aus laufen ließ, sich also
sämtliche Objekte im Ruhezustand befanden. SpriteKit ist hier offensichtlich schlecht opti-
miert.
Wenn Sie also eine Profiversion von Breakout programmierenmöchten, sollten Sie auf die Ver-
wendung der Physik-Engine verzichten und die Kollisionsberechnungen selbst durchführen.
Das ist nicht besonders schwierig und lässt sich für die simple Spielidee sicherlich effizienter
gestalten, als dies in SpriteKit der Fall ist.
1200
�
�
“buch” — 2017/10/6 — 8:49 — page 1201 — #1197
�
�
�
�
�
�
40
40.2 Initialisierung
Schläger einrichten (Paddle)
Der Schläger ist einfach ein weiteres SKShapeNode-Objekt, das im untersten Bildschirmviertel
platziert wird. Damit der Ball vomSchläger abprallt, ist ein physikalischer Körper erforderlich.
Gleichzeitig soll der Schläger aber nicht durch die Regeln der Physik bewegt werden, sondern
ausschließlich durch den Finger auf dem Display. Daher ist isDynamic = false erforderlich.
Die BitMask-Einstellungen stellen sicher, dass der Ball vom Schläger abprallt, dass SpriteKit
aber keine weiteren (rechenaufwendigen) Kollisionsdetektoren aktiviert.
func setupPaddle () {// Paddle unten positionieren ,// Breite ist 1/5 der Bildschirmbreitepaddle = SKShapeNode (
rectOf : CGSize (width : w * 0.20 , height : w * 0.04) )paddle .fillColor = SKColor .redpaddle .strokeColor = SKColor .red
paddle .position =CGPoint (x: w * 0.5 , // mittig
y: h * 0.2) // unteres Viertelpaddle .zPosition = 10self.addChild (paddle )
paddle .physicsBody = SKPhysicsBody (rectangleOf : paddle .frame.size)with(paddle .physicsBody !) {
$0.isDynamic = false$0.categoryBitMask = PhysCategory .paddle$0.collisionBitMask = PhysCategory .ball$0.contactTestBitMask = PhysCategory .none
}}
Ball einrichten
Der Ball ist ein kreisförmiges SKShapeNode-Objekt. Er wird vertikal etwas oberhalb des Schlä-
gers positioniert. Die horizontale Position ist vom Zufall abhängig.
Den physikalischen Körper wollte ich ursprünglich rund einrichten (also mit SKPhysicsBody
(circleOfRadius ...)), das hat sich aber nicht bewährt. Es kommt dann recht oft vor, dass
der Ball auf die Ecke eines Steins trifft und in einem sehr flachen Winkel abprallt. Das mag
physikalisch korrekt sein, der Effekt ist aber unvorhersehbar und dem Spiel nicht dienlich.
Deswegen habe ich den physikalischen Körper einfach quadratisch gewählt.
Bei der Einstellung der physikalischen Eigenschaften ist es wichtig, jede Form der Reibung
oder Dämpfung zu deaktivieren – sonst wird der Ball immer langsamer. Der Ball soll von
allen anderen Körpern abprallen. Eine Kollisionsbenachrichtigung ist aber nur beim Zusam-
mentreffen mit einem Stein erforderlich.
1201
�
�
“buch” — 2017/10/6 — 8:49 — page 1202 — #1198
�
�
�
�
�
�
40 Breakout
func setupBall () {ball = SKShapeNode (circleOfRadius : w/35)ball.fillColor = SKColor .blackball.strokeColor = SKColor .blackball.position = CGPoint (x: w * 0.25 + w * 0.5 * cRnd() , y: h*0.3)ball.zPosition = 10self.addChild (ball)
ball.physicsBody = SKPhysicsBody (rectangleOf : ball.frame.size)with(ball.physicsBody !) {
$0.friction = 0$0.angularDamping = 0$0.linearDamping = 0$0.restitution = 1$0.allowsRotation = false$0.categoryBitMask = PhysCategory .ball$0.collisionBitMask = PhysCategory .brick +
PhysCategory .frame +PhysCategory .paddle
$0.contactTestBitMask = PhysCategory .brick}
}
Der Ball ist anfänglich in Ruhe – er wird erst durch die Berührung des Displays in den touches-
Methoden in Bewegung gesetzt.
40.3 Spielsteuerung
Die touchesBegan-Methode ist für den Start des Spiels verantwortlich. Beim ersten Spiel mit
status == .waitForStart ist das Spielfeld bereits eingerichtet. Daher reicht es aus, den Ball
mit applyImpulse in Bewegung zu setzen. Wenn dagegen vorher schon eine Runde gespielt
wurde, müssen der Ball und die Spielsteine neu eingerichtet werden.
override func touchesBegan (_ touches : Set<UITouch >,with event: UIEvent ?)
{if status == .waitForStart {
// erstes Spiel: Ball in Bewegung setzenball.physicsBody !.applyImpulse (initialImpulse ())status = .runninglabel .text = ""
} else if status == .won || status == .lost {
1202
�
�
“buch” — 2017/10/6 — 8:49 — page 1203 — #1199
�
�
�
�
�
�
40
40.3 Spielsteuerung
// neues Spiel starten : zuerst aufräumen ...ball.removeFromParent ()for ch in self.children {
if let childname = ch.name , childname == "brick" {ch.removeFromParent ()
}}// ... dann das Spielfeld neu einrichtensetupBall ()setupBricks (rows:6, cols:6)ball.physicsBody !.applyImpulse (initialImpulse ())status = .runninglabel.text = ""self.isPaused = false
}}
// Startimpuls für den Ballfunc initialImpulse () -> CGVector {
return CGVector (dx: w * 0.05 , dy: w * 0.05)}
Schläger steuern
Um die Steuerung des Schlägers kümmert sich die touchesMoved-Methode. Relevant ist dabei
nur die X-Koordinate des Berührungspunkts. Sie legt die Position des Schlägermittelpunktes
fest. Die in GCOperators.swift definierte minMax-Funktion stellt dabei sicher, dass der Schläger
nicht über den Bildschirmrand bewegt wird.
override func touchesMoved (_ touches : Set <UITouch >,with event : UIEvent ?)
{if touches .count != 1 { return }let touch = touches .first!let xnew = touch .location (in: self).xlet xmin = paddle .frame.size.width /2let xmax = self.frame.size.width - xminpaddle .position =
CGPoint (x: minMax (xnew , minimum : xmin , maximum : xmax) ,y: paddle .position .y)
}
touchesEnded und touchesCancelled sind gemäß den Dokumentationsvorgaben ebenfalls
implementiert, enthalten aber keinen Code. Auf den Abdruck habe ich daher verzichtet.
1203
�
�
“buch” — 2017/10/6 — 8:49 — page 1204 — #1200
�
�
�
�
�
�
40 Breakout
Test, ob der Ball im Aus ist
In der update-Methodewird getestet, ob die Y-Koordinate des Balls kleiner ist als die des Schlä-
gers. In diesem Fall ist der Ball im Aus, das Spiel ist verloren und wird pausiert.
Ein wenig merkwürdig ist der restliche Code: Während der Tests ist es immer wieder vorge-
kommen (circa einmal pro Spiel), dass der Ball von seiner üblichen diagonalen Flugbahn
abwich und sich gänzlich horizontal bzw. vertikal bewegte. Ein vernünftiges Spiel ist dann
nicht mehr möglich. Wenn das passiert, die X- oder Y-Komponente der Geschwindigkeit also
nahe 0 ist, wird die Geschwindigkeit ganz auf 0 zurückgesetzt. Anschließend erhält der Ball
wieder seinen Startimpuls. Diese Maßnahme klingt recht radikal, ist aber im Spielverlauf
optisch nicht wahrnehmbar.
override func update (_ currentTime : TimeInterval ) {if status != .running { return }
// Test , ob das Spiel verloren istif ball.position .y < paddle .frame.minPoint ().y {
label .text = "Game Over"self.isPaused = truestatus = .lostreturn
}
// manchmal passiert es, dass der Ball sich nur noch horizontal oder// vertikal bewegt ; dann muss man der Physik ein wenig nachhelfenif abs(ball.physicsBody !.velocity .dx) <= 0.01 ||
abs(ball.physicsBody !.velocity .dy) <= 0.01{
ball.physicsBody !.velocity = CGVector .zeroball.physicsBody !.applyImpulse (initialImpulse ())
}}
Kollisionserkennung
Wenn der Ball einen Stein trifft, wird die Methode didBegin des SKPhysicsContactDelegate-
Protokolls aufgerufen. In der Methode verweist dann contact.bodyA oder contact.BodyB auf
diesen Stein. Er wird einfach entfernt. (Wenn Sie möchten, können Sie hier eine nette Anima-
tion einbauen, die den Stein explodieren oder in sich zusammenfallen lässt.)
Sollte die Anzahl der Steine damit auf 0 sinken, hat der Spieler bzw. die Spielerin das Spiel
gewonnen.
1204
�
�
“buch” — 2017/10/6 — 8:49 — page 1205 — #1201
�
�
�
�
�
�
40
40.3 Spielsteuerung
extension GameScene : SKPhysicsContactDelegate {func didBegin (_ contact : SKPhysicsContact ) {
var brick:SKNode !if contact .bodyA.categoryBitMask == PhysCategory .brick {
brick = contact .bodyA.node} else if contact .bodyB.categoryBitMask == PhysCategory .brick {
brick = contact .bodyB.node} else {
return}
// Stein entfernenbrick.removeFromParent ()
// Spielende ?brickcounter -= 1if brickcounter == 0 {
label.text = "Congratulations !"self.isPaused = truestatus = .won
}}
}
1205
Auf einen Blick
Teil ISwift .................................................................................................................... 19
Teil IIApp-Programmierung ................................................................................... 371
Teil IIIProgrammier- und Arbeitstechniken ........................................................ 575
Teil IVBeispielprojekte ............................................................................................... 1041
Auf einen Blick
�
�
“buch” — 2017/10/6 — 8:49 — page 5 — #1
�
�
�
�
�
�
Inhalt
Vorwort ............................................................................................................................................................... 15
TEIL I Swift
1 HelloWorld! ............................................................................................................................... 21
1.1 »Hello World« im Playground ....................................................................................................... 21
1.2 »Hello World« als Terminal-App ................................................................................................... 31
1.3 »Hello World« auf dem iPad .......................................................................................................... 39
2 Swift-Crashkurs ....................................................................................................................... 41
2.1 Elementare Syntaxregeln und Kommentare ............................................................................ 41
2.2 Variablen, Konstanten und Datentypen ..................................................................................... 46
2.3 Strukturierung des Codes ............................................................................................................... 50
2.4 Klassen und Datenstrukturen ....................................................................................................... 54
2.5 Fehlerabsicherung ............................................................................................................................ 56
2.6 Xcode-Crashkurs ................................................................................................................................ 58
3 Operatoren .................................................................................................................................. 71
3.1 Zuweisungs- und Rechenoperatoren .......................................................................................... 71
3.2 Vergleichsoperatoren und logische Operatoren ...................................................................... 76
3.3 Range-Operatoren ............................................................................................................................ 80
3.4 Operatoren für Fortgeschrittene .................................................................................................. 84
3.5 Eigene Operatoren ............................................................................................................................ 87
4 Variablenund Optionals ................................................................................................. 93
4.1 Variablen und Konstanten .............................................................................................................. 93
4.2 Optionals ............................................................................................................................................. 99
4.3 Wert- versus Referenztypen ........................................................................................................... 104
5
�
�
“buch” — 2017/10/6 — 8:49 — page 6 — #2
�
�
�
�
�
�
Inhalt
5 Verzweigungenund Schleifen ................................................................................... 107
5.1 Verzweigungen mit if ...................................................................................................................... 107
5.2 Inverse Logik mit guard ................................................................................................................... 110
5.3 Verzweigungen mit switch ............................................................................................................ 112
5.4 Versions- oder plattformabhängiger Code ................................................................................ 115
5.5 Schleifen .............................................................................................................................................. 117
5.6 Nicht triviale Schleifen .................................................................................................................... 121
6 Funktionenund Closures ................................................................................................ 127
6.1 Funktionen definieren und ausführen ....................................................................................... 127
6.2 Parameter ............................................................................................................................................ 138
6.3 Standardfunktionen ......................................................................................................................... 145
6.4 Funktionale Programmierung ....................................................................................................... 149
6.5 Closures ................................................................................................................................................ 154
7 Zahlen und geometrischeStrukturen ................................................................. 165
7.1 Zahlen und boolescheWerte ......................................................................................................... 165
7.2 NSNumber ........................................................................................................................................... 170
7.3 CGFloat, CGPoint, CGSize und Co. ................................................................................................ 171
8 Zeichenketten ........................................................................................................................... 179
8.1 Syntax ................................................................................................................................................... 180
8.2 Bearbeitung von Zeichenketten ................................................................................................... 184
8.3 Suchen und ersetzen ........................................................................................................................ 188
8.4 Zeichenketten zerlegen und zusammensetzen ....................................................................... 191
8.5 Zeichenketten und Zahlen umwandeln ..................................................................................... 197
8.6 Zeichenketten und binäre Daten umwandeln (Data-Struktur) .......................................... 201
9 Datum undUhrzeit .............................................................................................................. 203
9.1 Datum und Uhrzeit ermitteln und darstellen .......................................................................... 203
9.2 Rechnen mit Datum und Uhrzeit ................................................................................................. 205
10 Arrays, Dictionaries, Sets und Tupel ...................................................................... 207
10.1 Arrays .................................................................................................................................................... 207
10.2 Arrays und Aufzählungen verarbeiten ........................................................................................ 217
6
�
�
“buch” — 2017/10/6 — 8:49 — page 7 — #3
�
�
�
�
�
�
Inhalt
10.3 Dictionaries ......................................................................................................................................... 226
10.4 Sets ........................................................................................................................................................ 230
10.5 Option-Sets ......................................................................................................................................... 231
10.6 Tupel ...................................................................................................................................................... 233
10.7 Lottosimulator ................................................................................................................................... 235
11 Objektorientierte Programmierung I ................................................................... 241
11.1 Klassen und Strukturen ................................................................................................................... 242
11.2 Enumerationen .................................................................................................................................. 250
11.3 Eigenschaften ..................................................................................................................................... 254
11.4 Init- und Deinit-Funktion ................................................................................................................ 266
11.5 Methoden ............................................................................................................................................ 271
11.6 Subscripts ............................................................................................................................................ 278
11.7 Typ-Aliasse ........................................................................................................................................... 281
11.8 Speicherverwaltung ......................................................................................................................... 282
12 Objektorientierte Programmierung II ................................................................. 287
12.1 Vererbung ............................................................................................................................................ 287
12.2 Generics ............................................................................................................................................... 299
12.3 Protokolle ............................................................................................................................................. 304
12.4 Standardprotokolle ........................................................................................................................... 314
12.5 Extensions ........................................................................................................................................... 322
12.6 Protokollerweiterungen .................................................................................................................. 328
12.7 Reflection und Metatypen .............................................................................................................. 331
13 Fehlerabsicherung ................................................................................................................. 337
13.1 Fehlerabsicherungmit try und catch .......................................................................................... 337
13.2 Selbst Fehler auslösen (throws und throw) .............................................................................. 346
13.3 Fehler in Funktionen weitergeben (rethrows) .......................................................................... 350
13.4 Das Error-Protokoll ............................................................................................................................ 354
13.5 Fehlerabsicherung von API-Methoden (NSError) ..................................................................... 355
14 Importe, Attribute und Systemfunktionen .................................................... 359
14.1 Module, Frameworks und Importe .............................................................................................. 359
14.2 Attribute .............................................................................................................................................. 363
14.3 Systemfunktionen aufrufen .......................................................................................................... 365
7
�
�
“buch” — 2017/10/6 — 8:49 — page 8 — #4
�
�
�
�
�
�
Inhalt
TEIL II App-Programmierung
15 Hello iOS-World! ..................................................................................................................... 373
15.1 Projektstart ......................................................................................................................................... 374
15.2 Gestaltung der App .......................................................................................................................... 375
15.3 Steuerung der App durch Code ..................................................................................................... 380
15.4 Actions und Outlets für Fortgeschrittene .................................................................................. 385
15.5 Layout optimieren ............................................................................................................................. 388
15.6 Textgröße mit einem Slider einstellen ........................................................................................ 395
15.7 Apps auf dem eigenen iPhone/iPad ausführen ....................................................................... 398
15.8 Komponenten und Dateien eines Xcode-Projekts .................................................................. 400
16 iOS-Grundlagen ....................................................................................................................... 403
16.1 Model-View-Controller (MVC) ....................................................................................................... 403
16.2 Klassenhierarchie einer App-Ansicht .......................................................................................... 407
16.3 Die UIViewController-Klasse .......................................................................................................... 410
16.4 Phasen einer iOS-App ...................................................................................................................... 414
16.5 Auto Layout ......................................................................................................................................... 417
16.6 Layoutregeln durch Code definieren ........................................................................................... 433
16.7 Steuerelemente in einer Stack-View anordnen ....................................................................... 435
16.8 Layoutvarianten ................................................................................................................................. 440
16.9 Texteingaben ...................................................................................................................................... 448
16.10 Image-Views und Xcassets ............................................................................................................. 455
17 iOS-Appsmit mehreren Ansichten ......................................................................... 459
17.1 Storyboard und Controller-Klassen verbinden ......................................................................... 459
17.2 Ansichten durch Segues verbinden ............................................................................................. 460
17.3 Segues mit Datenübertragung ..................................................................................................... 465
17.4 Navigation-Controller ...................................................................................................................... 470
17.5 Tab-Bar-Controller ............................................................................................................................. 476
17.6 Split-View-Controller ........................................................................................................................ 482
17.7 Popups .................................................................................................................................................. 493
17.8 Ja/Nein-Dialoge (UIAlertController) ............................................................................................ 503
8
�
�
“buch” — 2017/10/6 — 8:49 — page 9 — #5
�
�
�
�
�
�
Inhalt
18 HellomacOS-World! ............................................................................................................ 507
18.1 Von iOS zu macOS ............................................................................................................................. 507
18.2 Lottozahlengenerator ...................................................................................................................... 509
19 macOS-Grundlagen ............................................................................................................. 519
19.1 Programmemit mehreren Fenstern ............................................................................................ 519
19.2 Tab-View-Controller .......................................................................................................................... 526
19.3 Standarddialoge ................................................................................................................................ 533
19.4 Tastatur ................................................................................................................................................ 538
19.5 Menüs ................................................................................................................................................... 543
19.6 Programme ohneMenü .................................................................................................................. 552
20 tvOS ................................................................................................................................................... 555
20.1 Hello tvOS! .......................................................................................................................................... 556
20.2 Fernbedienung auswerten ............................................................................................................. 561
20.3 Focus Engine ....................................................................................................................................... 567
TEIL III Programmier- und Arbeitstechniken
21 Dateien undUser-Defaults ........................................................................................... 577
21.1 User-Defaults ..................................................................................................................................... 577
21.2 Dateinamen und URLs ..................................................................................................................... 582
21.3 Bundle-Dateien und Assets ............................................................................................................ 584
21.4 Standardverzeichnisse ..................................................................................................................... 586
21.5 Dateioperationen .............................................................................................................................. 590
21.6 Wie geht’s weiter? ............................................................................................................................ 599
22 Netzwerk, XML und JSON .............................................................................................. 601
22.1 Dateien per HTTP/HTTPS laden .................................................................................................... 601
22.2 XML-Dokumente auswerten ......................................................................................................... 610
22.3 JSON-Encoder und -Decoder .......................................................................................................... 614
22.4 Webseiten anzeigen ......................................................................................................................... 621
9
�
�
“buch” — 2017/10/6 — 8:49 — page 10 — #6
�
�
�
�
�
�
Inhalt
23 Tabellenund Listen darstellen ................................................................................... 629
23.1 Listen in iOS-Apps (UITableView) ................................................................................................. 629
23.2 Prototypzellen .................................................................................................................................... 635
23.3 Individuelle Gestaltung von Listenzellen ................................................................................... 640
23.4 Veränderliche Listen ......................................................................................................................... 647
23.5 Tabellen in macOS-Apps (NSTableView) .................................................................................... 650
23.6 Collections asynchron füllen (UICollectionView) .................................................................... 661
24 GPS- und Kompassfunktionen ................................................................................... 671
24.1 Hello MapView! ................................................................................................................................. 671
24.2 Wegstrecke aufzeichnen ................................................................................................................. 676
24.3 Kompassfunktionen ......................................................................................................................... 683
25 Grafik und Animation ........................................................................................................ 687
25.1 Eigene Steuerelementemit Grafikfunktionen ......................................................................... 687
25.2 Kompass-Steuerelement ................................................................................................................ 694
25.3 Core Graphics ..................................................................................................................................... 702
25.4 Animationen ....................................................................................................................................... 706
26 Touch,Maus, Gestures und Drag&Drop .......................................................... 711
26.1 Touch ..................................................................................................................................................... 711
26.2 Maus ..................................................................................................................................................... 718
26.3 Gestures ............................................................................................................................................... 725
26.4 Drag&Drop (macOS) ....................................................................................................................... 728
26.5 Drag&Drop (iOS) .............................................................................................................................. 742
27 Audio, Video und Fotos .................................................................................................... 757
27.1 Audio-Wiedergabe mit dem AVAudioPlayer ............................................................................. 757
27.2 Audio-Wiedergabe mit dem AVPlayer ........................................................................................ 768
27.3 Audio-Wiedergabe mit dem AVPlayerViewController ........................................................... 770
27.4 Audio-Aufnahmenmit dem AVAudioRecorder durchführen .............................................. 772
27.5 Videos abspielen ................................................................................................................................ 777
27.6 Videos mit der Picker-View auswählen und aufnehmen ...................................................... 781
27.7 YouTube-Videos abspielen .............................................................................................................. 785
10
�
�
“buch” — 2017/10/6 — 8:49 — page 11 — #7
�
�
�
�
�
�
Inhalt
27.8 Fotos mit der Picker-View auswählen und aufnehmen ......................................................... 788
27.9 Fotos in einer AVCaptureSession aufnehmen .......................................................................... 791
27.10 Barcodes in einer AVCaptureSession erkennen ....................................................................... 799
28 SpriteKit ......................................................................................................................................... 803
28.1 Hello SpriteKit! ................................................................................................................................... 804
28.2 Sprites erzeugen und bewegen .................................................................................................... 813
28.3 Spielsteuerung durch Touch-Ereignisse ..................................................................................... 819
28.4 Bewegungssteuerung (Gyroskop und Accelerometer) .......................................................... 825
28.5 Aktionen ............................................................................................................................................... 832
28.6 Der Game-Loop .................................................................................................................................. 838
28.7 Kollisionserkennung ......................................................................................................................... 840
28.8 Minispiel: Luftballone abschießen .............................................................................................. 845
28.9 Physik .................................................................................................................................................... 852
28.10 Minispiel: Pyramide zerstören ...................................................................................................... 858
28.11 Scene-Editor ........................................................................................................................................ 865
28.12 Partikel-Emitter ................................................................................................................................. 872
29 iCloud ............................................................................................................................................... 875
29.1 iCloud-Grundlagen ........................................................................................................................... 875
29.2 Key/Value-Speicher .......................................................................................................................... 881
29.3 CloudKit-Grundlagen ....................................................................................................................... 888
29.4 CloudKit-Programmiertechniken ................................................................................................. 896
29.5 CloudKit-Beispiel ............................................................................................................................... 906
30 AsynchroneProgrammierung .................................................................................... 919
30.1 Hello Grand Central Dispatch! ...................................................................................................... 920
30.2 GCD-Grundlagen ............................................................................................................................... 923
30.3 Parallel rechnen ................................................................................................................................. 928
30.4 Die Async-Bibliothek ........................................................................................................................ 935
31 App Store und Co. .................................................................................................................. 937
31.1 iOS-Artwork (Icons, Launch Screen) ............................................................................................. 938
31.2 macOS-Artwork (Icon) ..................................................................................................................... 940
31.3 tvOS-Artwork (Parallax-Icons, Launch und Top Shelf Image) ............................................... 941
11
�
�
“buch” — 2017/10/6 — 8:49 — page 12 — #8
�
�
�
�
�
�
Inhalt
31.4 Mehrsprachige Apps ........................................................................................................................ 947
31.5 Eigene Apps im App Store anbieten ............................................................................................ 956
31.6 macOS-Programme selbst weitergeben .................................................................................... 964
32 Xcode-Arbeitstechniken .................................................................................................. 971
32.1 Simulator-Ausgaben stoppen ....................................................................................................... 971
32.2 Header-Code einer eigenen Klasse erzeugen ........................................................................... 972
32.3 Versionsverwaltungmit Git ........................................................................................................... 973
32.4 Crashlogs ............................................................................................................................................. 976
32.5 Refactoring .......................................................................................................................................... 977
32.6 Projekte umbenennen ..................................................................................................................... 978
32.7 Xcode-Verzeichnisse aufräumen .................................................................................................. 979
32.8 Apple Configurator ........................................................................................................................... 982
33 Server-side Swift .................................................................................................................... 985
33.1 Swift unter Linux ............................................................................................................................... 988
33.2 Vapor kennenlernen ......................................................................................................................... 995
33.3 Die Vapor-Toolbox ............................................................................................................................. 1004
33.4 Vapor-Grundlagen ............................................................................................................................ 1006
33.5 Datenbankanbindungmit Fluent ................................................................................................ 1017
33.6 Authentifizierung und Autorisierung ......................................................................................... 1028
33.7 Deployment ........................................................................................................................................ 1036
TEIL IV Beispielprojekte
34 New-York-Times-Bestseller ............................................................................................ 1043
34.1 New-York-Times-API ......................................................................................................................... 1045
34.2 Benutzeroberfläche .......................................................................................................................... 1048
34.3 Split-View-Variante ........................................................................................................................... 1053
35 To-do-Listen ................................................................................................................................ 1059
35.1 Gestaltung der Benutzeroberfläche ............................................................................................ 1060
35.2 Datenmodell ....................................................................................................................................... 1061
35.3 View-Controller-Klasse .................................................................................................................... 1062
12
�
�
“buch” — 2017/10/6 — 8:49 — page 13 — #9
�
�
�
�
�
�
Inhalt
35.4 Popup-View-Controller-Klasse ...................................................................................................... 1069
35.5 iCloud-Variante .................................................................................................................................. 1070
36 Schatzsuche ................................................................................................................................ 1075
36.1 Aufbau der App .................................................................................................................................. 1075
36.2 Datenmodell ....................................................................................................................................... 1080
36.3 LocationManager selbst gemacht ............................................................................................... 1082
36.4 Steuerelement zur Richtungsanzeige (UIBezierPath) ............................................................ 1086
36.5 Hauptansicht mit Listenfeld .......................................................................................................... 1087
36.6 Popup-Dialog zum Speichern ........................................................................................................ 1092
36.7 Detailansicht mit Richtungspfeil .................................................................................................. 1093
37 Währungskalkulator ........................................................................................................... 1101
37.1 App-Überblick .................................................................................................................................... 1101
37.2 Kurse ermitteln .................................................................................................................................. 1107
37.3 Das Datenmodell der App .............................................................................................................. 1110
37.4 Umrechnungsansicht ....................................................................................................................... 1113
37.5 Einstellungsansicht .......................................................................................................................... 1119
37.6 Internationalisierung und Lokalisierung .................................................................................... 1124
38 Fünf Gewinnt ............................................................................................................................. 1127
38.1 Die App »Fünf Gewinnt« ................................................................................................................. 1127
38.2 Enumerationen und globale Funktionen (Globals.swift) ...................................................... 1130
38.3 Die Spiellogik (FiveWins.swift) ...................................................................................................... 1134
38.4 Darstellung des Spielbretts und der Steine (BoardView.swift) ........................................... 1145
38.5 Steuerung des Spielablaufs (ViewController.swift) ................................................................ 1155
38.6 Der Popup-Dialog (PopupVC.swift) .............................................................................................. 1160
38.7 Erweiterungsmöglichkeiten .......................................................................................................... 1162
39 Icon-Resizer ................................................................................................................................. 1165
39.1 App-Überblick .................................................................................................................................... 1165
39.2 Icons verwalten (IconSize-Struktur) ............................................................................................. 1171
39.3 Hauptfenster (ViewController.swift) ........................................................................................... 1177
39.4 Drag&Drop-Quelle für Icons (IconCellView.swift) ................................................................. 1185
39.5 Drag&Drop-Empfänger für Icons (OriginalIconView.swift) ................................................ 1186
13
�
�
“buch” — 2017/10/6 — 8:49 — page 14 — #10
�
�
�
�
�
�
Inhalt
39.6 Popup-Menü (IconChoiceVC.swift) .............................................................................................. 1189
39.7 Temporäres Verzeichnis erstellen und löschen ........................................................................ 1190
40 Breakout ........................................................................................................................................ 1193
40.1 Programmaufbau .............................................................................................................................. 1194
40.2 Initialisierung ..................................................................................................................................... 1195
40.3 Spielsteuerung ................................................................................................................................... 1202
41 Pac-Man selbst gemacht ................................................................................................. 1207
41.1 Programmaufbau .............................................................................................................................. 1208
41.2 Der Tile-Editor »Tiled« ...................................................................................................................... 1210
41.3 Globale Konstanten, Datenstrukturen und Enumerationen ............................................... 1214
41.4 Initialisierung des Spiels ................................................................................................................. 1216
41.5 Die Maze-Klasse ................................................................................................................................ 1220
41.6 Aufbau der Spielszene (setup-Methoden) ................................................................................. 1224
41.7 Spielsteuerung (touch-Methoden) .............................................................................................. 1230
41.8 Bewegung des Pac-Mans ................................................................................................................ 1235
41.9 Steuerung der Monster ................................................................................................................... 1239
41.10 Kollisionen ........................................................................................................................................... 1245
41.11 Apple-TV-Variante von Pac-Man ................................................................................................... 1249
41.12 Pac-Man-Figuren zeichnen ............................................................................................................. 1252
42 Asteroids ........................................................................................................................................ 1255
42.1 Programmaufbau .............................................................................................................................. 1256
42.2 Globale Konstanten und Funktionen .......................................................................................... 1258
42.3 Programmstart und Tastaturereignisse (GameViewController) ......................................... 1258
42.4 Initialisierung des Spiels (GameScene) ....................................................................................... 1261
42.5 Spielablauf (ebenfalls in GameScene) ........................................................................................ 1267
42.6 FokussierbareMenütexte (MyLabel) ........................................................................................... 1273
42.7 Der Einstellungsdialog (MainScene) ........................................................................................... 1274
Index .................................................................................................................................................................... 1281
14
�
�
“buch” — 2017/10/6 — 8:49 — page 1281 — #1277
�
�
�
�
�
�
Index
_-Zeichen (Wildcard-Pattern) .......................................... 72
&-Zeichen (inout-Parameter) ....................................... 142
A
AAC-Format ............................................................................. 759
Abort-Struktur (Vapor) .................................................. 1010
abs-Funktion .......................................................................... 146
Abstand zwischen zwei Koordinaten-
punkten ......................................................................... 1096
Accelerometer ........................................................................ 825
accelerometerUpdateInterval-Eigenschaft ......... 827
acceptsFirstResponder-Eigenschaft ........................ 539
accountStatus-Methode .................................................. 896
action-Eigenschaft (NSMenuItem) ........................... 553
action-Parameter
addTarget ........................................................................... 433
Gesture Recognizer .................................................... 1063
Actions ............................................................................. 380, 405
macOS ................................................................................... 515
SpriteKit ............................................................................... 832
umbenennen ..................................................................... 386
activateFileViewerSelecting-Methode ................. 1179
Activity-Indictator-View .................................................. 920
adaptivePresentationStyle-Methode ..................... 495
add-Methode .......................................................................... 167
addAction-Methode ........................................................... 504
addButtonWithTitle-Methode .................................... 534
addConstraint-Methode ................................................. 434
addGestureRecognizer-Methode .............................. 728
adding-Methode ................................................................... 167
addInput-Methode ............................................................. 794
addInteraction-Methode ................................................ 745
addObserver-Methode ............................. 699, 883, 1085
addOutput-Methode ......................................................... 794
addSublayer-Eigenschaft ................................................ 778
addSubview-Methode .............. 433, 1122, 1150, 1182
addTarget-Methode ........................................................... 433
Adjust-Scroll-View-Insets-Option .......................... 1049
afconvert-Kommando ...................................................... 759
affectedByGravity-Eigenschaft ................................... 857
Aktionen (SpriteKit) ........................................................... 832
Aktuelles Verzeichnis ermitteln/ändern .............. 588
Alert-Dialog ............................................................................. 503
alertStyle-Eigenschaft ...................................................... 535
Align-Button ........................................................................... 418
alignment-Eigenschaft .................................................... 658
Stack-View .......................................................................... 436
all-Methode (Vapor/Fluent) ....................................... 1021
allowsRotation-Eigenschaft .......................................... 857
alpha-Eigenschaft .................................................. 708, 1248
SpriteKit ............................................................................... 815
alternate-Eigenschaft ........................................................ 720
Ambiguous Use of Function (Fehlermeldung) 134
anchorPoint-Eigenschaft .................................. 814, 1218
angularDamping-Eigenschaft ....................... 857, 1201
angularVelocity-Eigenschaft ........................................ 857
animate-Methode ....................................... 706, 834, 1150
Animationen .......................................................................... 706
im Spiel 5-Gewinnt ...................................................... 1150
SpriteKit-Aktionen ............................................ 834, 1227
Any-Datentyp ......................................................................... 319
AnyClass-Datentyp ............................................................. 320
AnyObject-Datentyp .......................................................... 319
Apache-Konfiguration (Vapor) ................................. 1038
API-Design-Richtlinien .................................................... 141
API-Version testen ............................................................... 115
App
Archiv erzeugen .............................................................. 962
auf iOS-Geräten ausführen ...................................... 398
beenden ............................................................................... 565
Bundle-Dateien ............................................................... 584
HelloWorld ........................................................................ 373
Icon ........................................................................... 938, 1165
ID ............................................................................................. 958
im App Store einreichen ............................................. 962
im Simulator ausprobieren ...................................... 378
Lebenszyklus ..................................................................... 414
Lokalisierung .................................................................... 947
Name ..................................................................................... 940
Sprache ................................................................................. 947
User-Defaults .................................................................... 577
weitergeben (iOS) ........................................................... 956
weitergeben (macOS) ................................................... 964
Willkommensbildschirm ........................................... 939
App Store ................................................................................... 956
App Transport Security ...................................... 626, 1053
AppDelegate-Klasse ......................................................... 1190
Init-Funktion ..................................................................... 530
iOS ........................................................................................... 415
Split-View-Controller-Beispiel ................................. 488
appdmg-Kommando ........................................................ 968
append-Methode ................................................................. 213
Zeichenketten ................................................................... 192
appendArc-Methode ......................................................... 722
1281
�
�
“buch” — 2017/10/6 — 8:49 — page 1282 — #1278
�
�
�
�
�
�
Index
appendBezierPathWithRoundedRect-
Methode ........................................................................... 733
appendingPathComponent-Methode ................... 583
appendingPathExtension-Methode ........................ 583
Apple Configurator ............................................................. 982
Apple Developer Program ...................................... 22, 399
AppleMovie Trailers .......................................................... 661
Apple TV .................................................................................... 555
Asteroids-Spiel .............................................................. 1255
Pac-Man ............................................................................ 1249
application-Methode ........................................................ 415
applicationDidBecomeActive-Methode ............... 415
applicationDidEnterBackground-Methode ........ 415
applicationDidFinishLaunching-Methode ...... 1190
applicationWillEnterForeground-Methode ....... 415
applicationWillResignActive-Methode ................. 415
applicationWillTerminate-Methode .......... 416, 1190
applyAngularImpulse-Methode ................................ 858
applyForce-Methode ......................................................... 858
applyImpulse-Methode ........................................ 858, 863
applyTorque-Methode ...................................................... 858
ARC ................................................................................................ 282
arch-Test .................................................................................... 116
Archiv (Xcode) ....................................................................... 962
arguments-Eigenschaft ................................................... 369
Arrays ........................................................................................... 207
Array-Struktur erweitern ........................................... 324
assoziative .......................................................................... 226
auslesen ............................................................................... 211
Doppelgänger entfernen ........................................... 226
durchwürfeln .................................................................... 225
filter, map und reduce ................................................. 220
Fixed Sized Arrays .......................................................... 216
initialisieren ...................................................................... 210
mehrdimensionale .......................................... 216, 1132
sortieren ............................................................................... 214
verändern ........................................................................... 213
zweidimensionale ....................................................... 1132
ArraySlice-Datentyp ........................................................... 212
ArrowView-Klasse (Beispiel) ...................................... 1086
as-Operator ................................................ 78, 297, 298, 331
Aspect-Fill-Einstellung .......................................... 431, 457
Aspect-Fit-Einstellung ........................................... 431, 457
assert-Funktion .................................................................... 345
Assets ........................................................................................... 584
Bitmaps ................................................................................ 585
CloudKit .................................................................... 878, 891
Farben ................................................................................... 586
speichern (CloudKit) ..................................................... 898
Assets.xcassets-Datei ........................................................ 455
Associated Values ................................................................ 252
Associated Type Constraints ........................................ 312
associatedtype-Schlüsselwort ..................................... 312
associativity-Schlüsselwort ..................................... 88, 89
Assoziative Arrays ............................................................... 226
Assoziativität ............................................................................. 86
Asteroids-Spiel .................................................................... 1255
Async-Bibliothek .................................................................. 935
async-Methode ........................................................... 609, 922
CloudKit-Beispiel ............................................................ 912
Trailer-Beispiel ...................................................... 666, 667
asyncAfter-Funktion ............................................ 925, 1133
Asynchrone Programmierung .................................... 919
Asynchroner Download .................................................. 604
Atlas (SpriteKit) ....................................................... 833, 1209
Atomic Transaction (CloudKit) ................................... 891
atomically-Parameter ....................................................... 595
ATS (App Transport Security) ...................................... 602
attitude-Eigenschaft .......................................................... 828
Attribute .................................................................................... 363
attribute-Methode .............................................................. 610
attributesOfFileSystem-Eigenschaft ....................... 560
attributesOfItem-Methode ............................................ 591
Audio ............................................................................................ 757
aufnehmen ........................................................................ 772
beschleunigt wiedergeben ........................................ 770
Bibliotheken ...................................................................... 758
Datei abspielen ................................................................ 759
Formate ............................................................................... 759
SpriteKit-Aktion ............................................................... 834
Stream abspielen ............................................................ 769
audioRecorderDidFinishRecording-Methode .. 775
AudioServicesPlaySystemSound-Funktion ........ 768
Aufräumarbeiten durchführen (defer) .................. 132
Auth- und AuthProvider-Bibliothek (Vapor) ... 1029
Authentifizierung (Vapor) ........................................... 1028
Auto Layout .................................................................. 388, 417
deaktivieren ....................................................................... 418
Maßeinheit ......................................................................... 417
Regeln durch Code definieren ................................. 433
Varianten ............................................................................ 440
Auto-Fokus (Kamera) ........................................................ 800
autoclosure-Attribut .......................................................... 157
autoFocusRangeRestriction-Eigenschaft ............. 800
Automatic Reference Counting .................................. 282
Autoresizing-Option ......................................................... 429
available-Attribut ................................................................. 363
available-Test .......................................................................... 115
availableFonts-Methode ................................................. 536
AVAsset-Klasse ....................................................................... 768
AVAudioPlayer-Klasse ....................................................... 759
AVAudioRecorder-Klasse ................................................. 772
AVAudioRecorderDelegate-Protokoll ...................... 775
AVAudioSession-Klasse .................................................... 773
AVCaptureDevice-Klasse ................................................. 791
AVCaptureDeviceDiscoverySession-Klasse ........ 795
1282
�
�
“buch” — 2017/10/6 — 8:49 — page 1283 — #1279
�
�
�
�
�
�
Index
AVCaptureDeviceInput-Klasse .................................... 791
AVCaptureMetadataOutputObjectsDelegate-
Protokoll .......................................................................... 799
AVCapturePhotoCaptureDelegate-Protokoll ..... 791
AVCapturePhotoOutput-Klasse ....................... 791, 799
AVCapturePhotoSettings-Klasse ..................... 791, 796
AVCaptureSession-Klasse ............................................... 791
AVCaptureVideoPreviewLayer-Klasse .................... 791
AVEncoderAudioQualityKey-Konstante ............... 775
AVFormatIDKey-Konstante ........................................... 775
AVFoundation-Bibliothek .............................................. 758
AVItem-Klasse ........................................................................ 768
AVKit-Bibliothek ................................................................... 758
AVNumberOfChannelsKey-Konstante .................. 775
AVPlayer-Klasse .................................................................... 768
in einem AVPlayerViewController ........................ 770
AVPlayerItemDidPlayToEndTime-Konstante .... 769
AVPlayerLayer-Klasse ........................................................ 778
AVPlayerViewController-Klasse ................................. 770
Video abspielen ............................................................... 777
AVSampleRateKey-Konstante ...................................... 775
B
Back-Button ............................................................................. 472
Background Capabilities ...................................... 677, 763
backgroundColor-Eigenschaft
Collection-View-Zelle ................................................... 666
SpriteKit ............................................................................. 1217
UIView ................................................................................ 1150
Badge-Eigenschaft (Tab-Bar-Item) ............................ 479
Bar-Button-Item ................................................................... 473
Barcodes erkennen ............................................................. 799
bcrypt-Algorithmus ........................................................ 1035
bcrypt.json-Datei (Vapor) ............................................ 1035
Bearer-Token (Vapor) ...................................................... 1030
Bechmarktests ....................................................................... 205
becomeFirstResponder-Methode .... 452, 539, 1069
Beispiel ............................................................................... 1092
Bedingte Protokollerweiterungen ............................ 329
beginDraggingSession-Methode ............................... 730
beginRefreshing-Methode ............................................ 649
Benannte Parameter ......................................................... 128
in Protokollen ................................................................... 305
Init-Funktion ..................................................................... 267
Benutzernamen feststellen .......................................... 903
Beschleunigungsmesser ................................................. 825
Beta-Versionen installieren (iOS, tvOS) ................. 982
Bewegungssteuerung ....................................................... 825
Bibliotheken (Server-side Swift) ................................. 992
Bild herunterladen ............................................................. 602
Binäre Datei herunterladen .......................................... 602
Binäre Daten ........................................................................... 201
Binäre Zahlen ......................................................................... 166
Binärer Operator ..................................................................... 84
BinaryFloatingPoint-Protokoll ................................... 167
BinaryInteger-Protokoll ....................................... 313, 324
Bitmap-Literale ..................................................................... 811
bitmapLiteral-Schlüsselwort ........................................ 811
Bitmaps
als PNG-Datei speichern ............................ 1175, 1252
Atlas .......................................................................... 833, 1209
erzeugen (macOS) ....................................................... 1254
für Sprites ............................................................................ 813
Images.xcassets-Datei ..................................... 455, 639
NSImage-Klasse ........................................................... 1173
skalieren ........................................................................... 1173
UIImage-Klasse ............................................................... 639
Bitweises Rechnen ................................................................. 75
blendMode-Eigenschaft ............................................... 1248
Bodies (SpriteKit) ................................................................. 856
bodyA/bodyB-Eigenschaft ............................................ 845
Bool-Datentyp ....................................................................... 170
Boolesche Werte ................................................................... 170
boolValue-Eigenschaft ..................................................... 591
borderColor-Eigenschaft ................................................ 413
borderWidth-Eigenschaft ............................................... 413
Bottom Layout Guide ....................................................... 432
bounds-Eigenschaft ............. 499, 689, 719, 847, 1153
Box2D-Engine ........................................................................ 852
break-Schlüsselwort
Schleifen .............................................................................. 119
switch .................................................................................... 113
brew-Kommando ...................................................... 968, 995
Bridging-Header-Datei ..................................................... 366
brighter-Methode ............................................................. 1132
Bundle-Dateien ..................................................................... 584
Bundle-ID .................................................................................. 957
in iTunes Connect .......................................................... 960
Bundle-Klasse ......................................................................... 584
Buttons
iOS ........................................................................................... 377
macOS ................................................................................ 1168
Textured Button ........................................................... 1168
buttonWithType-Methode ............................................ 433
C
Cache-Verzeichnis ............................................................ 1111
cachesDirectory-Konstante .......................................... 587
CAF-Format .............................................................................. 759
CALayer-Klasse .............................................. 413, 778, 1150
Camera Roll ............................................................................. 788
cameraDevice-Eigenschaft ............................................ 790
canBecomeFocused-Eigenschaft ............................... 568
Asteroids-Spiel .............................................................. 1273
in SpriteKit-Apps ............................................................. 572
cancelOperation-Methode ............................................ 540
1283
�
�
“buch” — 2017/10/6 — 8:49 — page 1284 — #1280
�
�
�
�
�
�
Index
canCreateDirectories-Eigenschaft ............................ 535
canEditRowAt-Parameter ............................................ 1067
canMoveRowAt-Parameter ........................................ 1067
Canvas-Value-Einstellung ............................................... 422
Capabilities ................................................................... 677, 763
Maps ...................................................................................... 675
capacity-Eigenschaft ......................................................... 215
capitalized-Eigenschaft ................................................... 186
Capture List ............................................................................. 161
capture-Methode ...................................................... 791, 799
Capture-Session
Barcodes erkennen ........................................................ 799
Fotos aufnehmen ........................................................... 791
capturePhoto-Methode ........................................ 791, 796
Capturing Values .................................................................. 159
Carthage .................................................................................... 361
case-Schlüsselwort ............................................................. 112
Casting ............................................................................. 297, 331
catch-Schlüsselwort ................................................ 338, 340
categoryBitMask-Eigenschaft ........................... 843, 857
cellForRow-Parameter ...................................................... 632
CG-Kürzel .................................................................................. 702
CGColor-Klasse ...................................................................... 413
CGContext-Klasse .................................................. 702, 1174
CGContextAddArc-Methode ........................................ 695
CGContextDrawPath-Methode ................................... 695
CGFloat-Datentyp ................................................................ 172
CGFloat-Typ ............................................................................. 397
CGImage-Klasse ................................................................. 1174
CGImageDestination-Klasse ..................................... 1175
CGImageDestinationFinalize-Funktion ............. 1175
CGMotion-Klasse ................................................................. 830
cgPath-Eigenschaft ............................................................. 860
CGPoint-Struktur ...................................................... 171, 719
erweitern ............................................................................. 176
CGRect-Struktur .............................................. 171, 658, 719
erweitern ............................................................................. 175
CGSize-Struktur ......................................................... 171, 719
CGVector-Struktur .............................................................. 171
changeCurrentDirectoryPath-Methode ............... 588
changeFont-Methode ....................................................... 536
Character-Datentyp ........................................................... 179
characters-Eigenschaft ..................................................... 540
CharacterSet-Struktur ...................................................... 187
childNode-Methode ............................................. 870, 1276
children-Eigenschaft ......................................................... 332
CKAccountChanged-Notification ............................. 897
CKAsset-Klasse ...................................................................... 898
CKContainer-Klasse ................................................. 896, 903
CKModifyRecordOperation-Klasse .......................... 898
CKQuery-Klasse .................................................................... 900
CKQueryOperation-Klasse ............................................ 900
CKRecord-Klasse ....................................................... 898, 900
CKRecordID-Klasse .................................................. 899, 903
CKRecordZone-Klasse ....................................................... 891
CKReference-Klasse ........................................................... 899
CKUserIdentity-Klasse ..................................................... 903
Class and Subtype Existentials ................................... 308
class-Schlüsselwort .................................................. 244, 275
clipToBounds-Eigenschaft ............................................. 457
CLLocation-Klasse ............................................................ 1096
CLLocationManager-Klasse ................................ 672, 679
Kompass .............................................................................. 683
teilen ................................................................................... 1082
CLLocationManagerDelegate-Protokoll ..... 678, 683
close-Methode ....................................................................... 525
Closed-Range-Operator ...................................................... 80
closePath-Methode .......................................................... 1086
Closures ..................................................................................... 154
Auto-Closures ................................................................... 157
Capture List ........................................................................ 161
Capturing Values ............................................................ 159
für Lazy Properties ........................................................ 256
Fehler (rethrows) ............................................................. 350
in Animationen ............................................................... 706
throws/rethrows ............................................................. 351
Trailing Closures ............................................................. 155
UIAlert-Beispiel ................................................................ 504
unowned self .......................................................... 161, 707
verzögert ausführen ....................................... 925, 1133
weak ....................................................................................... 161
Cloud (iCloud) ........................................................................ 875
CloudKit .......................................................................... 876, 888
CMCoreMotionManager-Klasse ................................ 827
CMTime-Struktur ..................................................... 769, 780
cmysql-Bibliothek ............................................................ 1026
Cocoa Touch ............................................................................ 409
Cocoa-Framework ............................................................... 508
CocoaPods ................................................................................ 361
YouTube-Beispiel ............................................................ 785
Codable-Protokoll .................................................. 614, 1080
CodingKeys-Enumeration (JSON) ............................. 617
Collection-View-Steuerelement ................................. 661
Beispiel zur Farbauswahl .......................................... 886
Foto-App .............................................................................. 797
Hintergrund unsichtbar ............................................. 797
collisionBitMask-Eigenschaft ........................... 844, 857
Color Panel ............................................................................... 537
Color Well .................................................................................. 537
color-Eigenschaft ................................................................. 537
SpriteKit ............................................................................... 815
colorBlendFactor-Eigenschaft ..................................... 815
command-Eigenschaft ..................................................... 720
CommandLine-Enumeration ......................................... 35
Comparable-Protokoll ...................................................... 318
compare-Methode .............................................................. 186
1284
�
�
“buch” — 2017/10/6 — 8:49 — page 1285 — #1281
�
�
�
�
�
�
Index
CompassView-Steuerelement (Beispiel) ............... 694
Compiler ...................................................................................... 38
completion-Parameter ....................................... 707, 1161
components-Methode ........................................... 192, 204
Zeichenketten in Zeilen zerlegen .......................... 369
compositingOperation-Eigenschaft .................... 1253
Compound Types ................................................................ 234
Compression Resistance Priority .............................. 438
Computed Properties ............................................... 96, 259
Extensions .......................................................................... 327
Fehler auslösen ................................................................ 349
preferredContentSize ................................................... 497
prefersStatusBarHidden ............................................ 438
Vererbung ........................................................................... 291
concludeDragOperation-Methode ................ 730, 741
Concurrent Queues ............................................................ 923
Config-Klasse (Vapor) ..................................................... 1007
Connections Inspector .......................................... 631, 652
constrainMaxCoordinate-Parameter .................. 1181
constrainMinCoordinate-Parameter ................... 1181
Constraints (Auto Layout) ................................... 388, 417
contactBitMask-Eigenschaft ........................................ 843
contactTestBitMask-Eigenschaft ............................... 858
Container (CloudKit) ......................................................... 889
Containment Segues ......................................................... 521
contains-Methode ................... 173, 219, 230, 232, 738
Content Compression ...................................................... 428
Content Compression Resistance Priority .......... 438
Content Hugging ................................................................. 428
contentMode-Eigenschaft ............................................. 716
eigene Steuerelemente ................................................ 698
Image-View ............................ 431, ............................ 457
contentOverlayView-Eigenschaft ............................. 771
contents-Eigenschaft ........................................................ 735
contentsOfDirectory-Methode ................................... 589
continue-Schlüsselwort .................................................. 120
continuousAutoFocus-Enumerationswert ........ 800
Control Center ......................................................... 812, 1196
control-Eigenschaft ............................................................ 720
Controller ................................................................................. 376
Vapor .................................................................................. 1022
controllers-Eigenschaft ................................................... 830
Convenience Init Function ............................................ 268
Vererbung ........................................................................... 293
convenience-Schlüsselwort .......................................... 268
convert-Methode ........................................ 720, 735, 1185
Fonts ...................................................................................... 536
Copy-on-Write (Zeichenketten) .................................. 183
copyItem-Methode ............................................................. 593
Core Data ................................................................................... 590
Core Graphics ......................................................................... 702
Core Libraries ........................................................................ 992
Core Location (CL) ............................................................... 672
CoreAudio-Bibliothek ....................................................... 758
CoreMotion-Bibliothek .................................................... 827
cornerRadius-Eigenschaft .............................................. 413
count-Eigenschaft ......................................... 184, 211, 229
CountableClosedRange-Struktur ................................. 80
CountablePartialRangeFrom-Struktur ..................... 80
CountableRange-Struktur ................................................ 80
Crashlogs ................................................................................... 976
createArray2D-Funktion .............................................. 1132
createDirectoryAtPath-Methode ............................ 1191
cRnd-Funktion ....................................................................... 847
crypto.json-Datei (Vapor) ............................................ 1035
currentDirectoryPath-Eigenschaft ........................... 588
currentTime-Eigenschaft ............................................... 769
CustomStringConvertible-Protokoll ......... 314, 1080
D
darker-Methode ................................................................. 1132
Dashboard (iCloud) ............................................................ 892
data-Methode ......................................................................... 201
String ..................................................................................... 617
Data-Source-Protokoll ...................................................... 656
NSTableView ..................................................................... 652
UITableView ...................................................................... 632
Data-Struktur ................................................. 201, 602, 1081
dataEncodingStrategy-Eigenschaft ......................... 615
dataSource-Eigenschaft
NSTableView ..................................................................... 652
UICollectionView ............................................................ 666
UIPickerView .................................................................. 1120
UITableView ...................................................................... 631
date-Methode
Calendar .............................................................................. 205
DateFormatter ................................................................. 204
Date-Struktur ......................................................................... 203
tvOS-Beispiel ..................................................................... 558
dateEncodingStrategy-Eigenschaft ......................... 615
dateFormat-Eigenschaft .................................................. 203
DateFormatter-Klasse ....................................................... 203
Dateien ....................................................................................... 577
auswählen .......................................................................... 533
Eigenschaften ermitteln ............................................. 590
Größe ermitteln ............................................................... 590
kopieren ............................................................................... 593
löschen ................................................................................. 593
temporäre Datei ............................................................. 588
testen, ob Datei existiert ............................................ 583
Textdateien lesen/schreiben .................................... 595
URLs ....................................................................................... 582
verschieben ........................................................................ 593
Dateisystem (Größe ermitteln) ................................. 560
1285
�
�
“buch” — 2017/10/6 — 8:49 — page 1286 — #1282
�
�
�
�
�
�
Index
Datenbanken
CloudKit ............................................................................... 890
Vapor/Fluent .................................................................. 1017
Datenquelle im Connections Inspector
einstellen .............................................................. 631, 652
Datensatz speichern (CloudKit) ................................. 898
Datentypen .............................................................................. 104
Aliasse ................................................................................... 281
ermitteln ...................................................................... 78, 331
Funktionstypen ............................................................... 150
Datum ......................................................................................... 203
deadline-Parameter .............................................. 925, 1133
decimalSeparator-Eigenschaft ................................. 1117
Decodable-Protokoll .......................................................... 614
decode-Methode .................................................................. 621
default-Schlüsselwort (switch) ................................... 113
defaultManager-Methode ........................................... 1190
DefaultPrecedence (Operatoren) ................................. 86
defaults-Kommando ......................................................... 581
Defaultwerte für Parameter .......................................... 144
defer-Schlüsselwort ........................................................... 132
in try-catch-Konstruktionen .................................... 344
Deinit-Funktion ......................................................... 271, 282
Dekrement-Operator ........................................................... 74
delay-Funktion ................................................................... 1133
delegate-Eigenschaft
AVAudioRecorder ............................................................ 775
CLLocationManager .................................................... 679
MKMapView ..................................................................... 679
NSApplicationDelegate .............................................. 531
NSFontManager ............................................................. 536
NSTableView ........................................................ 652, 1184
UIApplication ................................................................... 416
UIPickerView .................................................................. 1120
UIPopoverPresentationController ............ 495, 502
UITableView ...................................................................... 631
UITapGestureRecognizer ........................................ 1118
UITextField ........................................................... 450, 1117
Delegation .......................................................... 304, 405, 449
Beispiel für eigenes Delegation-Protokoll .... 1097
CLLocationManagerDelegate-Beispiel ............. 678
im Connections Inspector einstellen ....... 631, 652
NSTableView ........................................................... 652, 656
SetPieceDelegate-Beispiel ...................................... 1145
UITableView ...................................................................... 631
UITextFieldDelegate-Beispiel .................................. 450
delete-Methode (Vapor) ................................................ 1008
Delete-on-Swipe (UITableView) ............................... 1067
deleteRows-Methode ...................................................... 1067
deleteSelf-Konstante ......................................................... 899
deleteXxx-Methoden (NSEvent) ................................ 540
deletingLastPathComponent-Methode ................ 583
deletingPathExtension-Methode ............................. 583
density-Eigenschaft ........................................................... 857
Deployment (Vapor) ....................................................... 1036
dequeueReusableCell-Methode ...................... 632, 635
DerivedData-Verzeichnis ................................................ 980
description-Eigenschaft .................................... 314, 1080
Designated Init Function ............................................... 268
Vererbung ........................................................................... 293
desiredAccuracy-Eigenschaft ...................................... 679
destination-Eigenschaft .................................................. 467
destinationIndexPath-Eigenschaft .......................... 754
detailTextLabel-Eigenschaft ......................................... 636
Developer Program .................................................... 22, 399
Development Environement (CloudKit) .............. 891
Device Orientation ............................................................. 825
deviceMotionUpdateInterval-Eigenschaft ......... 827
devices-Eigenschaft ........................................................... 795
Devie Orientation ............................................................... 825
Dictionaries ............................................................................. 226
Dictionary-Datentyp (Hashable) ............................... 316
didBegin-Methode (Kollisionen) .................. 845, 1204
Luftballon-Beispiel ........................................................ 851
Pac-Man ............................................................................ 1245
didChangeExternallyNotification-Konstante ... 883
didEnd-Methode (Kollisionserkennung) ............. 845
didFinishDownloadingTo-Parameter .................... 606
didFinishProcessingPhotoSampleBuffer-
Parameter ....................................................................... 796
didMove-Methode .............................................................. 473
didReceiveMemoryWarning-Methode .................. 411
didSelectRow-Parameter ............................................. 1124
didSet-Funktion ............................. 257, 290, 1062, 1114
Beispiel .................................................................... 694, 1153
didUpdateFocus-Methode .................... 568, 571, 1278
Trailer-Beispiel ................................................................. 669
discardableResult-Attribut ................................. 131, 364
discoverUserIdentity-Methode .................................. 903
Disk-Image ............................................................................... 968
dismiss-Methode ...................................................... 503, 523
dismissController ................................................................ 524
dismissViewControllerAnimated-Methode .... 1161
Dispatch-Framework ......................................................... 919
DispatchGroup-Klasse ...................................................... 924
DispatchQoS.QoSClass-Enumeration .................... 924
DispatchQueue-Klasse ............................ 922, 925, 1133
Code imMain-Thread ausführen ......................... 609
Trailer-Beispiel ................................................................. 666
DispatchTime-Klasse ........................................... 925, 1133
distanceFromLocation-Methode ............................ 1096
distanceTo-Methode .......................................................... 176
Distribution Provisioning Profile ............................. 956
distribution-Eigenschaft ................................................ 436
Division durch null ............................................................... 74
DMG-Datei erstellen .......................................................... 968
1286
�
�
“buch” — 2017/10/6 — 8:49 — page 1287 — #1283
�
�
�
�
�
�
Index
do-Schlüsselwort (try-catch) ........................................ 338
Docker ......................................................................................... 989
Vapor .................................................................................. 1003
Document-Outline-Seitenleiste ................................ 394
documentDirectory-Konstante .................................. 587
Dokumentenbasierte Apps ........................................... 877
domain-Eigenschaft .......................................................... 356
Doppelgänger im Array entfernen .......................... 226
Doppelte Optionals ............................................................ 343
Double-Datentyp ................................................................. 166
Double-Init-Funktion ....................................................... 200
Downcast ................................................................ 78, 297, 331
Downloads per HTTP/HTTPS ....................................... 601
einer inaktiven App fortsetzen ............................... 605
im Hintergrund ............................................................... 604
downloadsDirectory-Konstante ................................ 587
downloadTask-Methode ................................................. 606
Drag&Drop ............................................................................ 728
Dateinamen empfangen ............................. 737, 1186
Dateinamen senden .................................................. 1185
iOS ........................................................................................... 742
macOS ................................................................................... 728
UITableView-Steuerelement .................................... 749
weitergeben .................................................................... 1178
Zeichenkette empfangen ........................................... 737
Zeichenkette senden ..................................................... 735
dragDelegate-Eigenschaft .............................................. 751
draggingEntered-Methode .............................. 729, 1187
draggingExited-Methode ..................................... 729, 741
draggingPasteboard-Methode .................................... 740
draggingSession-Methode .................... 730, 736, 1185
draggingUpdated-Methode .......................................... 729
dragInteraction-Methode .................................... 743, 746
drand48-Funktion ................................................. 169, 1134
draw-Funktion .................................................................... 1174
draw-Methode ............................................... 541, 722, 1173
5-Gewinnt-Beispiel ...................................................... 1149
Drag-und-Drop-Beispiel ............................................. 733
Grafikprogrammierung ............................................. 689
Hintergrundfarbe .......................................................... 693
drawRect-Methode .......................................................... 1086
drawsBackground-Eigenschaft ................................... 658
dRnd-Funktion ...................................................................... 847
drop-Methode ........................................................................ 219
dropDelegate-Eigenschaft ............................................. 751
Dropdown-Liste ................................................................. 1119
dropFirst-Methode ............................................................. 218
dropInteraction-Methode ................................... 743, 747
dropLast-Methode .............................................................. 218
Droplet-Klasse (Vapor) .................................................. 1006
dropSessionDidUpdate-Parameter .......................... 753
dynamic-Schlüsselwort ................................................... 248
E
EAN8/EAN13-Barcode ....................................................... 800
Edges (SpriteKit) ................................................................... 856
Eigenschaften ......................................................................... 254
beobachten ........................................................................ 257
Computed Properties ................................................... 259
Extensions .......................................................................... 327
Fehler auslösen ................................................................ 349
Read-Only-Eigenschaft ............................................... 261
statische Eigenschaften .............................................. 259
Zugriff mit Optional Chaining ............................... 103
Zugriff per KeyPath ....................................................... 333
Eingabefokus einstellen ............................................... 1069
Einstellungen (iOS) öffnen ............................................ 896
Einstellungen (macOS) .................................................... 526
element-Methode ............................................................... 610
else-Schlüsselwort ............................................................... 107
guard ..................................................................................... 110
Emitter (SpriteKit) ............................................................... 872
Encodable-Protokoll .......................................................... 614
encode-Methode ....................................................... 615, 621
endedAtPoint-Parameter ............................................... 730
endEditing-Methode ........................................... 450, 1118
endIndex-Eigenschaft ....................................................... 193
endRefreshing-Methode ................................................. 649
enum-Schlüsselwort ............................................................. 97
Beispiele ............................................................................ 1130
Enumerationen
als Datentypen ................................................................ 250
Associated Values .......................................................... 252
Beispiel ............................................................................... 1171
Beispiele ............................................................................ 1130
indirekt/rekursiv ............................................................. 253
zur Definition von Konstanten ................................. 97
Ephemeral-Konfiguration (URLSession) .............. 605
equalTo-Methode ................................................................ 173
Equatable-Protokoll ................................................ 316, 325
als Extension implementieren ................................ 324
Erdbeschleunigung ............................................................ 828
Error-Protokoll ...................................................................... 354
escaping-Attribut ...................................................... 162, 364
Eulersche Zahl ........................................................................ 148
Exceptions ..................................................................... 337, 349
exit-Funktion ......................................................................... 565
Exit-Icon (ViewController) ............................................. 463
Exponential-Operator ......................................................... 89
ExpressibleByStringLiteral-Protokoll ..................... 320
Extended Grapheme Cluster ........................................ 183
Extensions ............................................................................... 322
Beispiele ............................................................................ 1132
bequemer Zeichenkettenzugriff ............................ 195
eigene map-Methode .................................................. 352
Protokolle ........................................................................... 328
1287
�
�
“buch” — 2017/10/6 — 8:49 — page 1288 — #1284
�
�
�
�
�
�
Index
F
Fünf-Gewinnt-App ........................................................... 1127
Fade-In-Effekt ......................................................................... 708
fadeAlpha-Methode ........................................................... 833
fadeIn-Methode .................................................................... 833
fadeOut-Methode ................................................................ 833
Failable Init Functions ...................................................... 269
fallthrough-Schlüsselwort (switch) ......................... 113
false ............................................................................................... 170
familyName-Eigenschaft ................................................ 903
Farb-Literale ............................................................................ 811
Farben
abdunkeln ........................................................................ 1132
auswählen .......................................................................... 533
aufhellen ........................................................................... 1132
Fatal Error ................................................................................. 337
fatalError-Funktion ............................................................ 137
Fehler
Absicherung ...................................................................... 337
auslösen (throw) ............................................................. 346
do-try-catch ....................................................................... 338
NSError-Klasse ................................................................. 355
Weitergabe ......................................................................... 342
Fenster
ausblenden ......................................................................... 554
Größe fixieren ........................................................ 512, 524
in den Vordergrund bringen .................................... 553
per Code erzeugen ......................................................... 525
schließen .............................................................................. 524
Fernbedienung (Apple TV) ............................... 561, 1260
fetchUserRecordID-Methode ...................................... 903
FileAttributeKey-Struktur .............................................. 591
fileExists-Methode .............................................................. 591
fileExistsAtPath-Methode ........................................... 1190
FileManager-Klasse ............................................................ 587
Dateioperationen .......................................................... 590
Standardverzeichnisse ermitteln .......................... 587
fileprivate-Schlüsselwort ................................................ 247
fileURL-Eigenschaft (CloudKit) ................................... 900
fileURL-Konstante ............................................................... 732
fill-Methode ............................................................... 691, 1086
fillColor-Eigenschaft .......................................................... 816
filter-Methode ............................................................. 187, 220
Dictionaries ....................................................................... 230
Fluent-Datensätze ...................................................... 1021
Sets .......................................................................................... 231
final-Schlüsselwort .................................................. 248, 293
finally-Schlüsselwort ......................................................... 344
find-Methode (Vapor/Fluent) ................................... 1021
Finder per Code anzeigen ............................................ 1179
First Responder ....................................................... 544, 1069
Menüs .................................................................................. 546
Tastatur (iOS) .................................................................... 452
Tastatur (macOS) ........................................................... 538
first-Eigenschaft ............................................. 193, 211, 218
first-Methode (Vapor/Fluent) ................................... 1021
Fixed Sized Arrays ............................................................... 216
Fixed-width-constraints-Warnung .......................... 431
flagsChanged-Methode ................................................... 539
flashMode-Eigenschaft .................................................... 796
flatMap-Methode ................................................................. 221
Fließkommazahlen ............................................................ 166
FloatingPoint-Protokoll ................................................... 167
Fluent-Bibliothek (Vapor) ............................................ 1017
fluent.json-Datei (Vapor) ............................................. 1025
Focus Engine (Apple TV) .................................................. 567
Asteroids-Beispiel ........................................................ 1273
focusMode-Eigenschaft ................................................... 800
Fokus-Einstellung (Kamera) ......................................... 800
follow-Methode .................................................................... 832
Font auswählen ..................................................................... 533
Font Manager ......................................................................... 536
Font Panel ................................................................................. 536
Font-Attribute ändern ...................................................... 532
font-Eigenschaft ................................................................... 397
for-in-Schleife ........................................................................ 117
Forced Try ................................................................................. 343
forces-Eigenschaft ............................................................... 712
forEach-Methode ................................................................. 222
Foreign-Key-Fehler (MySQL) ...................................... 1025
Formatieren
Datum und Uhrzeit ...................................................... 203
Zahlen ................................................................................... 199
Fotos
aus der Camera-Roll auswählen ........................... 788
in einer Capture-Session aufnehmen ................. 791
mit der Picker-View aufnehmen ........................... 790
Foundation-Framework ..................................................... 33
frame-Eigenschaft .............................. 433, 658, 719, 735
SKNode-Klasse ................................................................. 840
Frameworks ............................................................................. 359
Server-side Swift .............................................................. 986
Xcode ..................................................................................... 675
Free Provisioning ................................................................ 398
friction-Eigenschaft ........................................................ 1201
front-Enumerationswert ................................................ 790
Front-Kamera ......................................................................... 795
func-Schlüsselwort ............................................................. 127
Funktionale Programmierung .................................... 149
Funktionen .............................................................................. 127
als Parameter ................................................................... 151
als Rückgabewert ........................................................... 152
Funktionstypen ............................................................... 150
Gültigkeitsebenen .......................................................... 135
globale Funktionen ....................................................... 145
1288
�
�
“buch” — 2017/10/6 — 8:49 — page 1289 — #1285
�
�
�
�
�
�
Index
Namen .................................................................................. 134
optionale ............................................................................. 310
Parameter ........................................................................... 138
Rückgabewert .................................................................. 129
Rückgabewert ignorieren .......................................... 131
Standardfunktionen ..................................................... 145
verschachtelte Funktionen ....................................... 135
verzögert ausführen ....................................... 925, 1133
Funktionsabschluss (Closure) ..................................... 154
G
Gültigkeitsebenen
Funktionen ......................................................................... 135
Klassen ................................................................................. 248
Game-Loop (SpriteKit) ..................................................... 838
GameController-Bibliothek ............................ 830, 1269
GameKit-Bibliothek ........................................................ 1242
Ganze Zahlen .......................................................................... 166
Garbage Collector ................................................................ 282
Gatekeeper ............................................................................... 965
GCController-Klasse ............................................. 830, 1269
Generalisierung .................................................................... 297
Generated Interface ........................................................... 972
Generics ..................................................................................... 299
Array-Beispiel ................................................................... 216
Extensions .......................................................................... 324
Protokolle ........................................................................... 312
Type Constraints ............................................................ 302
Gesture Recognizer ............................................................ 725
Long Press .......................................................... 1062, 1064
Tap ....................................................................................... 1118
tvOS ........................................................................................ 567
get-Methode (Vapor) ....................................................... 1008
get-Schlüsselwort ............................................. 96, 259, 279
getifaddrs-Funktion ........................................................... 365
GIMP (Parallax-Icons) ....................................................... 942
Git ....................................................................................... 973, 996
givenName-Eigenschaft .................................................. 903
GKGridGraph-Klasse ...................................................... 1242
GKInspectable-Attribut .................................................... 364
Globale Funktionen ........................................................... 145
Globale Queues ..................................................................... 923
Gomoku .................................................................................. 1127
GPS-Funktionen ................................................................... 671
Grafikprogrammierung ................................................... 687
Drag&Drop (UIBezierPath) .................................... 733
in einer MapView (MK-Methoden) ...................... 680
Hockey-Spieler zeichnen ............................................ 541
Kompass-Steuerelement ............................................ 694
Kreise zeichnen (UIBezierPath) .............................. 720
Objekt ausschneiden ................................................. 1253
Steuerelement zur Richtungsanzeige ............ 1086
Grand Central Dispatch (GCD) .................................... 919
gravity-Eigenschaft .............. 828, 841, 855, 858, 1269
group-Methode (SpriteKit-Aktionen) ..................... 835
groupingSeparator-Eigenschaft .............................. 1115
Grundrechenarten ................................................................ 73
guard-Schlüsselwort ............................................... 110, 349
Gyroskop ................................................................................... 825
gyroUpdateInterval-Eigenschaft ............................... 827
H
Half-Open-Range-Operator ............................................. 80
Hash-Code (Vapor) ........................................................... 1035
Hashable-Protokoll .................................................. 227, 316
hasItemsConforming-Methode ................................. 748
hasPrefix-Methode ............................................................. 185
hasSuffix-Methode ................................................ 185, 1191
Haversine-Formel ............................................................. 1096
Header-Code erzeugen .................................................... 972
height-Eigenschaft ............................................................. 719
heightForRowAt-Parameter .......................................... 644
heightOfRow-Parameter ................................................. 657
Heimatverzeichnis ................................................ 587, 1254
HelloWorld
Animationen ..................................................................... 706
iCloud .................................................................................... 882
iOS-App ................................................................................. 374
iOS-Appmit Popup ........................................................ 493
Linux ...................................................................................... 988
macOS-Programm ........................................................ 507
MapView/GPS .................................................................. 671
Package Manager .......................................................... 993
Playground ........................................................................... 21
Script ......................................................................................... 38
Terminal App ....................................................................... 31
Vapor (Server-side Swift) ............................................ 996
Hexadezimale Zahlen ....................................................... 166
Hide-Bars-On-Swipe-Option ........................................ 645
HIG (Human Interface Guidelines) ............... 938, 942
higherThan-Schlüsselwort (Operatoren) ................ 89
Highscore speichern (Asteroids-Spiel) ................ 1272
Hintergrund-App ...................................................... 677, 763
Hintergrundfarbe von Fenster (macOS) ............... 888
Homebrew-Paketmanager ................................. 968, 995
horizontalAlignmentMode-Eigenschaft .............. 818
HTTP(S)-Dokument laden .............................................. 601
HTTP-Requests ................................................................... 1000
HTTPS (Vapor) ..................................................................... 1036
HTTPS-Probleme mit NSURL ....................................... 602
Human Interface Guidelines ............................ 938, 942
1289
�
�
“buch” — 2017/10/6 — 8:49 — page 1290 — #1286
�
�
�
�
�
�
Index
I
IBAction-Attribut ...................................................... 364, 383
IBDesignable-Attribut ............................................ 364, 701
IBInspectable-Attribut ........................................... 364, 701
IBOutlet-Attribut ....................................................... 364, 383
iCloud .......................................................................................... 875
iCloud Drive ....................................................................... 877
iCloud-ID ermitteln ....................................................... 903
Key/Value-Speicher ....................................................... 881
Key/Value-Speicher (To-do-App) ......................... 1070
Icon ............................................................................................ 1165
App .......................................................................................... 938
iTunes Connect ................................................................ 961
Resizer ................................................................................ 1165
icon-Eigenschaft (NSAlert) ............................................ 535
IconSize-Struktur (Icon-Resizer-Beispiel) ......... 1171
id-Datentyp (Objective-C) .............................................. 319
ID-Nummer (CloudKit) .................................................... 891
Identifier-Klasse (Vapor) .............................................. 1031
if-available-Test ..................................................................... 115
if-let-Konstruktion ............................................................. 108
Kaskaden ............................................................................. 109
kombiniert mit Bedingungen ................................. 110
if-Verzweigungen ................................................................. 107
let (Optionals) ............................................. 102, 108, 740
image-Eigenschaft ......................................... 659, 705, 735
Image-Picker-Controller ....................................... 781, 788
Image-View-Steuerelement ............................. 642, 1104
imageComponentsProvider-
Eigenschaft ....................................................... 735, 1185
imageLiteral-Schlüsselwort .......................................... 811
Images.xcassets-Datei ...................................................... 455
UIImage-Objekt erzeugen ......................................... 639
imageView-Eigenschaft (UITableCell) .................... 636
Implicitly Unwrapped Optionals ............................... 101
import-Anweisung ............................................................. 359
in-Schlüsselwort (Closures) ........................................... 154
include-Anweisung (Bridging-Datei) ...................... 366
Index-Datentyp ..................................................................... 188
Zeichenketten ................................................................... 193
index-Methode ...................................................................... 219
Zeichenketten ........................................................ 193, 194
IndexPath-Klasse ................................................................. 647
indexPath-Methode ............................................. 647, 1091
indexPathForCell-Methode ........................................... 647
indices-Eigenschaft ............................................................ 223
indirect-Schlüsselwort ..................................................... 253
infinity-Eigenschaft .............................................................. 74
infix-Schlüsselwort ............................................................... 88
Info.plist-Datei ...................................................................... 940
ändern (App Transport Security) .......................... 626
Privacy-Einträge (Standortzugriff) ...................... 673
Privacy-Einträge (Video-Zugriff) ........................... 781
Init-Funktion ............................................................... 244, 266
Designated versus Convenience ............................ 268
Enumeration ..................................................................... 250
Fehler auslösen (throw) .............................................. 347
nil zurückgeben ............................................................... 269
Overloading ...................................................................... 268
Redundanz vermeiden ................................................ 296
UIViewController ........................................................... 412
Vererbung ........................................................................... 293
initRnd-Funktion ................................................................. 847
Inkrement-Operator ............................................................. 74
inout-Schlüsselwort ........................................................... 142
insert-Methode .......................................................... 213, 230
insertContentOf-Methode ............................................. 213
insertRows-Methode ...................................................... 1066
insertText-Methode ........................................................... 540
insertXxx-Methoden (NSEvent) ................................. 540
instantiateController-Methode .................................. 525
instantiateViewController-Methode ...................... 499
Instanzmethoden ................................................................ 271
Int-Datentyp ........................................................................... 166
Int-Init-Funktion .................................................................. 199
Interface ..................................................................................... 304
Interface Builder .................................................................. 383
Interface Orientation ........................................................ 825
internal-Schlüsselwort ..................................................... 247
Internationalization (i18n) ............................................ 947
Internet-Radio abspielen ................................................ 769
Interpolation (Strings) ...................................................... 197
interpretKeyEvents-Methode ...................................... 540
intersect-Methode .............................................................. 738
intersects-Methode ................................................. 173, 840
invalidate-Methode ............................................................ 926
iOS
DeviceSupport-Verzeichnis ...................................... 980
Grundlagen ........................................................................ 403
HelloWorld ........................................................................ 374
Simulator ................................................................. 378, 675
Versionsnummer ermitteln ...................................... 559
IP-Adresse ermitteln .......................................................... 365
iPhone X
Safe Area Layout Guides ............................................ 432
SpriteKit ............................................................................... 809
iRnd-Funktion ....................................................................... 847
is-Operator ............................................................ 78, 298, 331
isBezeled-Eigenschaft ....................................................... 658
isDeletableFile-Methode ................................................. 591
isDynamic-Eigenschaft .................................................... 857
SpriteKit ............................................................................... 844
isEditable-Eigenschaft ...................................................... 658
isEmpty-Eigenschaft ............................................... 211, 229
isEnabled-Eigenschaft ................................................... 1063
isMultipleTouchEnabled-Eigenschaft ......... 713, 819
1290
�
�
“buch” — 2017/10/6 — 8:49 — page 1291 — #1287
�
�
�
�
�
�
Index
iso8601-Konstante (JSONEncoder) ........................... 615
isPaused-Eigenschaft ........................................................ 837
isReadableFile-Methode .................................................. 591
isResting-Eigenschaft ....................................................... 857
isSourceTypeAvailable-Methode ............................... 781
isUserInteractionEnabled-Eigenschaft .................. 745
isViewLoaded-Methode ................................................... 481
isWritableFile-Methode ................................................... 591
itemsForAddingTo-Parameter .................................... 753
itemsForBeginning-Parameter ........................ 746, 753
iTunes Connect ..................................................................... 956
J
Ja/Nein-Dialog ....................................................................... 503
joined-Methode ......................................................... 192, 224
JoinedSequence-Struktur ............................................... 225
JSON .............................................................................................. 614
Codable-Protokoll .......................................................... 614
Vapor .................................................................................. 1011
JSONDecoder-Klasse ............................................ 616, 1081
NYT-Beispiel .................................................................... 1046
JSONEncoder-Klasse ............................................. 615, 1081
K
Kürzester-Pfad-Problem ............................................... 1242
Kamera wechseln ................................................................ 795
Kanonenkugel (Beispiel) ................................................. 858
Key/Value-Paare ................................................................... 226
iCloud ......................................................................... 876, 881
iCloud (To-do-App) ..................................................... 1070
keyCode-Eigenschaft ......................................................... 540
keyDown-Methode ............................................................. 539
KeyedDecodingContainer .............................................. 621
KeyPath-Ausdrücke ............................................................ 333
keys-Eigenschaft .................................................................. 229
keyUp-Methode .................................................................... 539
Kitura-Framework ............................................................... 986
Klassen ....................................................................................... 242
verschachteln ................................................................... 249
Kollisionserkennung ......................................................... 840
Luftballone ......................................................................... 845
Pac-Man ............................................................................ 1245
Kommandoparameter ........................................................ 35
Kommentare ............................................................................. 43
MARK .................................................................................... 733
Playground ........................................................................... 28
Kompass ......................................................................... 671, 683
Kalibrierung ...................................................................... 684
Komplexe Zahlen (Operator-Beispiel) ....................... 87
Konstanten ................................................................................. 94
Eigenschaften ................................................................... 255
Eulersche Zahl .................................................................. 148
Pi .............................................................................................. 148
Kontextmenü ......................................................................... 550
Koordinatensystem ............................................................ 718
Kreis zeichnen ......................................................... 722, 1253
Kreiselkompass ..................................................................... 825
Kreisteilungszahl ................................................................. 148
kUTTypeImage-Konstante ............................................. 748
kUTTypeMovie-Konstante ............................................ 781
L
Label
macOS ................................................................................... 512
SpriteKit ............................................................................... 818
Sprunglabel (break/continue) ................................ 120
Lambda-Ausdruck ............................................................... 154
Landscape-Modus ............................................................... 825
last-Eigenschaft ............................................... 193, 211, 218
lastPathComponent-Eigenschaft .............................. 583
Launch Image (tvOS) ......................................................... 946
launch-Methode ................................................................... 369
launchApplication-Methode ........................................ 621
launchPath-Eigenschaft .................................................. 369
LaunchScreen-Datei ........................................................... 939
Lautstärke ändern ............................................................... 761
Layer ............................................................................................. 778
layer-Eigenschaft .................................................... 888, 1150
Layered Image File Format ............................................ 942
Layout Guides ........................................................................ 432
layoutFrame-Eigenschaft .................................. 809, 1197
layoutMargins-Eigenschaft ........................................... 809
Layoutregeln ........................................................................... 417
Hoch- und Querformat ............................................... 445
je nach Device variieren ............................................. 440
Varianten ............................................................................ 440
Lazy Properties ..................................................................... 255
Beispiel ................................................................................. 605
lazy-Eigenschaft ................................................................... 215
LazyMapCollection-Datentyp ..................................... 229
LCR-Datei .................................................................................. 942
Lebenszyklus
App .......................................................................................... 414
View-Controller ............................................................... 410
Left-Shift (bitweises Rechnen) ....................................... 75
leftBarButtonItem-Eigenschaft .................................. 492
leftItemsSupplementBackButton-Eigenschaft 492
let-Schlüsselwort .................................................................... 94
in switch-Konstruktionen ......................................... 114
mit if ............................................................................ 108, 740
mit switch-case ............................................................... 252
mit while .............................................................................. 119
letters-Eigenschaft .............................................................. 187
limit-Methode (Vapor/Fluent) .................................. 1021
line-Methode .......................................................................... 691
linearDamping-Eigenschaft ............................ 857, 1201
1291
�
�
“buch” — 2017/10/6 — 8:49 — page 1292 — #1288
�
�
�
�
�
�
Index
lineWidth-Eigenschaft ..................................................... 722
SpriteKit ............................................................................... 816
Listen-Steuerelement (iOS) ........................................... 629
veränderliche Listen ..................................................... 647
Picker-View ..................................................................... 1119
LiteralConvertible-Protokolle ...................................... 320
loadObjects-Methode ............................................. 748, 754
loadRequest-Methode ........................................ 622, 1052
locale-Eigenschaft .................................................... 199, 203
Locale-Struktur .......................................................... 199, 203
im Playground ................................................................. 198
Localization (l10n) ............................................................... 947
Localization native development region ............. 948
localizedCaseInsensitiveCompare ........................... 186
localizedDescription-Eigenschaft ............................. 356
Location Manager .................................................... 678, 679
Kompass .............................................................................. 683
teilen ................................................................................... 1082
location-Methode ................................................................ 712
locationInView-Methode ............................................. 1153
locationInWindow-Eigenschaft ................................. 720
locationManager-Methode ................................ 680, 683
locationManagerShouldDisplayHeading-
Calibration-Methode ............................................... 684
lockFocus-Methode ......................................................... 1173
lockForConfiguration-Methode ................................. 800
logische Operatoren ............................................................. 80
Lottozahlen .............................................................................. 231
Benchmarks ...................................................................... 235
macOS-Beispiel ................................................................ 509
lowercased-Methode ......................................................... 186
LSR-Datei ................................................................................... 942
M
Main Queue ............................................................................. 923
main-Methode (Dispatch Queue) ............................. 923
makeImage-Funktion .................................................... 1174
makeJSON-Methode (Vapor) ..................................... 1012
makeKeyAndOrderFront-Eigenschaft ................... 553
makeQuery-Methode (Vapor/Fluent) .................. 1021
map .................................................................................................. 81
Map Kit (MK) ........................................................................... 671
Framework ......................................................................... 675
map-Methode
rethrows-Beispiele ......................................................... 350
Sets .......................................................................................... 231
mapOverlay-Methode ...................................................... 680
mapValues-Methode (Dictionaries) ........................ 230
mapView-Methode ............................................................. 682
MapView-Steuerelement ................................................ 671
MariaDB (Vapor) ................................................................ 1028
MARK-Kommentar ..................................................... 45, 733
Markdown-Kommentare .......................................... 28, 43
mass-Eigenschaft ................................................................. 857
Master-Ansicht zuerst anzeigen ................................ 490
Mathematische Funktionen ......................................... 148
Maus ............................................................................................ 718
max-Eigenschaft .................................................................. 166
max-Funktion ........................................................................ 147
maximumFractionDigits-Eigenschaft ..... 199, 1115
maxPoint-Eigenschaft ..................................................... 175
maxX/maxY-Eigenschaft ................................................ 173
Maze-Klasse (Pac-Man-Spiel) ..................................... 1220
MediaPlayer-Bibliothek ........................................ 758, 761
mediaTypes-Eigenschaft ................................................ 781
Mehrblättrige Dialoge ...................................................... 526
Mehrdimensionale Arrays ............................................. 216
erzeugen ........................................................................... 1132
Mehrfachvererbung ........................................................... 288
Menüs ......................................................................................... 543
deaktivieren ....................................................................... 552
Kontextmenüs .................................................................. 550
menu-Eigenschaft
NSApplication .................................................................. 550
NSView .................................................................................. 550
Menubar-App ......................................................................... 552
Message-Box ........................................................................... 533
messageText-Eigenschaft ............................................... 534
metadataOutput-Methode ............................................ 802
Metal ............................................................................................ 803
Metatypen ................................................................................ 334
Methoden ................................................................................. 271
Aufruf mit Optional Chaining ................................ 103
MutatingMethods ........................................................ 273
optionale ............................................................................. 310
Signatur ............................................................................... 276
statische Methoden ...................................................... 275
Typmethoden ................................................................... 275
middlePoint-Eigenschaft ............................................... 175
midX/midY-Eigenschaft .................................................. 173
Mikrofon (Audio-Aufnahmen) .................................... 772
min-Eigenschaft ................................................................... 166
min-Funktion ......................................................................... 147
minimumFractionDigits-Eigenschaft ...... 199, 1115
minimumPressDuration-Eigenschaft ................ 1062
minPoint-Eigenschaft ...................................................... 175
minX/minY-Eigenschaft ................................................. 173
Mirror-Datentyp .................................................................. 332
MKMapView-Klasse ........................................................... 671
MKMapViewDelegate-Protokoll ................................ 678
MKPolyline-Klasse .............................................................. 680
MKPolylineRenderer ......................................................... 682
MobileCoreServices-Bibliothek .................................. 781
Model-Protokoll (Vapor/Fluent) .............................. 1017
modifierFlags-Eigenschaft .................................. 540, 720
Modifizier ................................................................................. 248
1292
�
�
“buch” — 2017/10/6 — 8:49 — page 1293 — #1289
�
�
�
�
�
�
Index
Module ............................................................................. 246, 359
Modulo-Operator ................................................................... 73
motion-Eigenschaft ........................................................... 830
mouseDown-Methode ............................ 718, 724, 1185
mouseDragged-Methode ....................... 718, 735, 1185
mouseEntered-Methode ................................................. 718
mouseExited-Methode .................................................... 718
mouseUp-Methode ............................................................ 718
move-Methode ...................................................................... 691
SpriteKit ............................................................................... 832
moveItem-Methode ........................................................... 593
moveRowAt-Parameter ................................................ 1067
moveXxx-Methoden (NSEvent) ................................. 540
Movie-Trailer-Beispiel ...................................................... 661
MP3/MP4-Format ................................................................ 759
MPMedia-Konstanten ...................................................... 765
MPNowPlayingInfoCenter-Klasse ............................ 764
MPRemoteCommandCenter-Klasse ....................... 764
MPVolumeView-Klasse .................................................... 761
Multi-Threading ................................................................... 919
Multiple-Touch-Option ................................................... 713
mutating-Schlüsselwort ................................................. 273
MySQL (Vapor) .................................................................... 1026
mysql.json-Datei (Vapor) ............................................. 1026
N
Nachkommaanteil ........................................................... 1215
Nachrichten anzeigen ...................................................... 533
Namenlose Parameter ..................................................... 139
Navigation-Controller ...................................................... 471
Navigation per Code .................................................... 474
Beschriftung ändern ..................................................... 474
Detailansicht einer Liste ............................................ 644
mit Split-View-Controller ................................ 485, 491
mit Tab-Bar-Controller ............................................... 479
weißer Streifen .............................................................. 1049
navigationItem-Eigenschaft ......................................... 492
Nebenläufige Programmierung ................................ 919
Nested Functions ................................................................. 135
Nested Generics .................................................................... 300
Never-Schlüsselwort .......................................................... 137
New York Times (Beispiel-App) ................................ 1043
nextCommand-Eigenschaft ......................................... 766
nextFocusedItem-Eigenschaft .................................... 571
NextStep ....................................................................................... 27
nginx-Webserver (Vapor) ............................................. 1038
NIB-Datei ................................................................................... 412
Nil ..................................................................................................... 84
Nil-Coalescing-Operator ............................................... 84
nil-Schlüsselwort ............................................................... 99
nil-Test .................................................................................. 102
noescape-Attribut ............................................................... 162
nonConformingFloatEncodingStrategy-
Eigenschaft .................................................................... 615
noreturn-Attribut ................................................................ 137
Notification Center .......................................................... 1083
AVPlayer .............................................................................. 769
Layout ändern .................................................................. 447
NotificationCenter-Klasse ........................................... 1084
notify-Methode ..................................................................... 924
nowPlayingInfo-Eigenschaft ........................................ 765
npm-Kommando ................................................................. 968
NSAlert-Klasse ....................................................................... 534
NSApplication-Klasse .......................................... 517, 1179
NSAppTransportSecurity-Eintrag ............................. 602
NSBezierPath-Klasse ................................. 722, 733, 1253
NSBitmampImageRep-Klasse ................................... 1254
NSButton-Klasse ............................................................... 1189
NSCalendar-Klasse .............................................................. 204
NSCameraUsageDescription-Key ................... 783, 788
NSCocoaErrorDomain ...................................................... 356
NSCoding-Protokoll ........................................................... 412
NSColorPanel-Klasse ......................................................... 537
NSColorWell-Steuerelement ......................................... 537
NSData-Klasse ........................................................................ 201
NSDate-Klasse ........................................................................ 203
NSDictionary-Klasse .......................................................... 530
NSDraggingDestination-Protokoll ........................... 729
NSDraggingImageComponent-Klasse ................... 735
NSDraggingInfo-Klasse .................................................... 740
NSDraggingItem-Klasse .......................... 730, 735, 1185
NSDraggingSource-Protokoll ......................... 735, 1185
NSError-Klasse ....................................................................... 355
NSEvent-Klasse
Maus ...................................................................................... 720
Tastatur ............................................................................... 540
NSEventModifierFlags-Struktur ................................ 720
NSException-Klasse ........................................................... 349
NSFileManager-Klasse ................................................... 1190
NSFilenamesPboardType-Konstante ...................... 740
NSFont-Klasse ........................................................................ 532
NSFontManager-Klasse ........................................ 532, 536
NSFontPanel-Klasse ........................................................... 536
NSGestureRecognizer-Klasse ....................................... 725
NSGradient-Klasse ........................................................... 1253
NSHomeDirectory-Funktion .......................... 587, 1254
NSImage-Klasse ...................................................... 659, 1173
Assets verwenden .......................................................... 585
NSImageView-Klasse ......................................................... 733
NSImageView-Steuerelement ..................................... 659
NSItemProvider-Klasse .............................. 743, 746, 753
NSItemProviderReading-Protokoll .......................... 748
NSLayoutConstraint-Klasse .......................................... 434
NSLocale-Klasse .................................................................... 186
NSLocalizedString-Klasse ............................................... 954
1293
�
�
“buch” — 2017/10/6 — 8:49 — page 1294 — #1290
�
�
�
�
�
�
Index
NSMakeRange-Funktion ................................................. 189
NSManaged-Attribut ......................................................... 365
NSMenu-Klasse ..................................................................... 545
NSMenuItem-Klasse .......................................................... 545
NSMenuValidation-Protokoll ...................................... 550
NSMicrophoneUsageDescription-Key ................... 783
NSMutableDictionary-Klasse .................................... 1111
NSNumber-Klasse ............................................................... 170
Beispiel Dateigröße ....................................................... 591
NSNumberFormatter-Klasse .......................... 657, 1117
NSObject-Klasse ......................................................... 288, 656
description-Eigenschaft ............................................. 315
NSObject-Protokoll .......................................................... 1083
NSObjectProtocol-Protokoll ........................... 288, 1083
NSOpenPanel-Klasse ......................................................... 535
Datei auswählen .......................................................... 1188
Verzeichnisauswahl ................................................... 1179
NSPasteBoard-Klasse ......................................................... 740
NSPasteboard.PasteboardType-Struktur ............. 732
NSPhotoLibraryUsageDescription-Key ...... 781, 788
NSPoint-Klasse ...................................................................... 735
NSPoint-Struktur ................................................................. 719
NSPredicate-Klasse .................................................. 900, 901
NSProgressIndicator-Steuerelement ...................... 929
NSRect-Klasse ........................................................................ 735
NSRect-Struktur ................................................................... 719
NSRegularExpression-Klasse ....................................... 189
NSResponder-Klasse ............................................... 538, 546
NSSavePanel-Klasse ........................................................... 535
NSSize-Klasse ......................................................................... 735
NSSize-Struktur .................................................................... 719
NSSortDescriptor-Klasse ..................................... 659, 902
NSSplitter-Klasse ................................................................. 529
NSSplitView-Steuerelement ...................................... 1167
Delegation ....................................................................... 1181
NSSplitViewController-Klasse .................................. 1168
NSSplitViewDelegate-Protokoll ............................... 1181
NSStatusBar-Klasse ............................................................ 553
NSString-Datentyp ............................................................. 179
NSString-Klasse .................................................................... 753
NSTableView-Steuerelement ....................................... 650
NSTableViewDataSource-Protokoll .......................... 652
Icon-Resizer-Beispiel ................................................. 1182
NSTableViewDelegate-Protokoll .................. 652, 1184
NSTabViewController-Steuerelement .................... 526
NSTemporaryDirectory-Funktion .............. 588, 1190
NSTextField-Steuerelement ............................... 512, 658
NSUbiquitousKeyValueStore-Klasse ....................... 883
NSURL-Klasse ......................................................................... 602
NSURLConnection-Klasse .............................................. 605
NSUUID-Klasse ..................................................................... 588
NSView-Klasse ............................................................. 509, 657
NSViewController-Klasse ................................................ 509
NSWindow-Klasse .................................................... 508, 512
NSWindowController-Klasse ....................................... 508
NSWorkspace-Klasse ............................................ 621, 1179
NSxxx-Klassennamen ......................................................... 27
null-Schlüsselwort ................................................................. 99
NumberFormatter-Klasse ..................... 199, 200, 1115
numberFromString-Methode ..................................... 200
numberOfComponents-Methode ......................... 1121
numberOfLoops-Eigenschaft ...................................... 760
numberOfMatches-Methode ....................................... 189
numberOfRowsInComponent-Parameter ....... 1121
numberOfRowsInSection-Parameter .................... 632
numberOfRowsInTableView-Methode ................. 652
numberOfSectionsInTableView-Methode .......... 632
numberStyle-Eigenschaft .............................................. 199
O
objc-Attribut ................................................................. 311, 364
ObjCBool-Typ ......................................................................... 591
Object-relational Mapping (ORM) ......................... 1017
objectForKey-Methode .................................................. 1111
objectValueForTableColumn-Methode ................. 652
Objektorientierte Programmierung ....................... 241
Observer (Eigenschaften) ............................................... 257
Observer (Notification Manager) ........................... 1085
Öffentliche Datenbank (CloudKit) ........................... 889
Oktale Zahlen ......................................................................... 166
on-Eigenschaft ...................................................................... 710
open-Methode ............................................................ 621, 622
open-Schlüsselwort ............................................................ 247
Operatoren ................................................................................. 71
Assoziativität ...................................................................... 86
eigener Exponential-Operator .................................. 89
eigener Operatoren für komplexe Zahlen .......... 87
eigener Vergleichsoperator ......................................... 88
eigener Vergleichsoperator für Vektoren ......... 276
Operatoren für CGPoint und CGVector ............. 174
Priorität .................................................................................. 86
selbst definieren ................................................................. 87
selbst definieren (Beispiele) ........................... 174, 198
Optional Chaining ...................................................... 85, 102
Optional Try ............................................................................ 343
optional-Schlüsselwort .................................................... 310
Optionale Funktionen/Methoden ........................... 310
Optionale Parameter ......................................................... 144
Optionale Protokollregeln ............................................. 310
Optionals ............................................................................. 84, 99
als Rückgabewert von Funktionen ...................... 130
Codable-Protokoll .......................................................... 619
doppelte Optionals ....................................................... 343
if-let-Kombination .............................................. 108, 740
in Kombination mit try .............................................. 343
Init-Funktion ..................................................................... 269
1294
�
�
“buch” — 2017/10/6 — 8:49 — page 1295 — #1291
�
�
�
�
�
�
Index
OptionSet-Protokoll ........................................................... 231
Beispiel ................................................................................. 720
orderFrontFontPanel-Methode .................................. 536
orderOut-Methode ............................................................. 554
orientation-Eigenschaft .................................................. 447
origin-Eigenschaft .............................................................. 719
os-Test ......................................................................................... 116
Outlets ............................................................................. 382, 405
Collections .......................................................................... 386
macOS ................................................................................... 515
umbenennen ..................................................................... 386
outputFormatting-Eigenschaft .................................. 615
Overloading
Funktionen ......................................................................... 134
Init-Funktion ..................................................................... 268
override-Schlüsselwort .................................................... 289
Computed Properties ................................................... 291
Property Observers ....................................................... 290
View-Controller ............................................................... 414
P
Package Manager ...................................................... 363, 993
Palindromtest ........................................................................ 187
Parallax-Effekt ........................................................................ 941
Parameter ................................................................................. 138
autoclosures ...................................................................... 157
benannte Parameter .................................................... 128
benannte, in Init-Funktionen .................................. 267
benannte, in Protokollen ........................................... 305
Inout-Parameter ............................................................. 142
noescape ............................................................................. 162
optionale Parameter .................................................... 144
unbenannte Parameter .............................................. 139
variable Anzahl ............................................................... 144
von Terminal-Apps ........................................................... 35
zweinamige Parameter .............................................. 140
Parsen
Datum und Uhrzeit ....................................................... 204
Zahlen ................................................................................... 200
PartialRangeThrough-Struktur ..................................... 80
PartialRangeUpTo-Struktur ............................................. 80
Partikel-Emitter .................................................................... 872
pasteConfiguration-Eigenschaft ................................ 745
patch-Methode (Vapor) ................................................. 1008
path-Eigenschaft .................................................................. 583
path-Methode (Bundle-Datei) ..................................... 584
pathFinder-Methode ...................................................... 1243
Pattern-Zeichen ....................................................................... 72
pause-Methode ..................................................................... 769
pauseCommand-Eigenschaft ...................................... 766
PDF417-Barcode .................................................................... 800
Perfect-Framework ............................................................. 986
perform-Funktion ............................................................... 925
perform-Methode ............................................................... 900
performDragOperation-Methode .... 730, 741, 1187
performDrop-Parameter ................................................ 748
performDropWith-Parameter ..................................... 754
performSegue-Methode ....................................... 469, 525
Navigation-Controller ................................................. 474
permittedArrowDirections-Eigenschaft .............. 498
Photo Library ......................................................................... 788
photoOutput-Methode .................................................... 796
physicalMemory-Eigenschaft ..................................... 559
physicsBody-Eigenschaft ................................................ 842
physicsWorld-Eigenschaft ............................................. 841
Physik (SpriteKit) ................................................................. 852
Pi-Konstante ........................................................................... 148
Picker-View-Steuerelement .......................... 1106, 1119
Rollover ............................................................................. 1121
pickerView-Methode ...................................................... 1121
picturesDirectory-Konstante ....................................... 587
Pipe-Klasse ............................................................................... 369
Pixel versus Punkt .............................................................. 417
Platformspezifischer Code ............................................ 116
play-Methode ......................................................................... 759
playCommand-Eigenschaft .......................................... 766
playerViewDidBecomeReady-Methode ................ 787
Playgrounds ............................................................................... 22
auf dem iPad ........................................................................ 39
Locale-Einstellungen .................................................... 199
playSoundFileNamed-Methode (SpriteKit) ........ 834
PLIST-Format .......................................................................... 577
PNG-Datei speichern
NSBitmapImageRep .................................................. 1252
CGImage ........................................................................... 1175
Polygon (SpriteKit) ............................................................. 860
Polygon zeichnen ............................................................. 1253
Polymorphie ........................................................................... 297
Popover-Segue ....................................................................... 493
popToRootViewController-Methode ...................... 474
popToViewController-Methode ................................. 474
Popups ........................................................................................ 493
5-Gewinnt-App .............................................................. 1160
Größe einstellen .............................................................. 495
per Code anzeigen ......................................................... 499
Richtung festlegen ......................................................... 497
popViewController-Methode ......................... 474, 1099
position-Eigenschaft ......................................................... 810
post-Methode (Notification Manager) ................ 1085
post-Methode (Vapor) .................................................... 1008
postfix-Schlüsselwort .......................................................... 88
Potenzieren ................................................................................ 74
pow-Funktion ........................................................................... 74
Precedence-Gruppen ........................................................... 86
precedence-Schlüsselwort ............................................ 88
precedencegroup-Schlüsselwort .............................. 89
1295
�
�
“buch” — 2017/10/6 — 8:49 — page 1296 — #1292
�
�
�
�
�
�
Index
preferredBarTintColor-Eigenschaft ......................... 626
preferredContentSize-Eigenschaft ........................... 496
preferredControlTintColor-Eigenschaft ............... 626
preferredFocusEnvironments-
Eigenschaft ......................................... 571, 1261, 1277
prefersStatusBarHidden-Eigenschaft ....... 812, 1196
prefix-Methode ..................................................................... 218
prefix-Schlüsselwort ............................................................ 88
prepare-Methode ...................................................... 467, 522
Detailansicht bei Table-View ................................... 647
Fluent .................................................................................. 1018
Popups auf dem iPhone ............................................. 495
prepareToPlay-Methode ................................................. 759
prepartions-Eigenschaft (Fluent) ........................... 1024
preprareForDragOperation-Methode .................... 730
present-Methode ........................................... 499, 504, 625
für Alert-Dialoge ............................................................. 504
Presentation-Controller .................................................. 461
presentedViewController-Eigenschaft .................. 417
Presenting Segues ............................................................... 521
presentingViewController-Eigenschaft ................ 497
presentScene-Klasse .......................................................... 868
presses-Methoden .............................................................. 565
pressesBegan-Methode ................................................ 1260
prettyPrinted-Konstante (JSONEncoder) ............. 615
previousCommand-Eigenschaft ................................ 766
previousLocation-Methode .......................................... 820
previouslyFocusedItem-Eigenschaft ...................... 571
print-Funktion ....................................................................... 147
CustomStringConvertible-Protokoll ................... 314
Printable-Protokoll ............................................................. 314
printf-Syntax .......................................................................... 197
Priorität von Operatoren .................................................. 86
Privacy-Keys
Camera Usage ....................................................... 783, 788
Location Usage ................................................................ 673
Microphone Usage ............................................. 773, 783
Photo Library ......................................................... 781, 788
Private Datenbank (CloudKit) ..................................... 889
private set für Read-Only-Eigenschaften ............. 261
private-Schlüsselwort ....................................................... 247
privateCloudDatabase-Eigenschaft ......................... 896
Process-Klasse ....................................................................... 369
ProcessInfo-Klasse .............................................................. 559
Production Environment (CloudKit) ...................... 891
Profil-Dateien (iOS/tvOS) ............................................... 982
Programm
beenden (iOS) .................................................................... 414
beenden (macOS) ........................................................... 517
signieren .............................................................................. 964
weitergeben ....................................................................... 964
Projekte umbenennen ..................................................... 978
prompt-Eigenschaft ........................................................... 472
Properties ................................................................................. 254
Computed Properties ........................................ 259, 291
Extensions .......................................................................... 327
Lazy Properties ................................................................ 255
Property Observers ....... 257, 290, 694, 1062, 1114
Property Observers (Beispiel) ............................... 1153
Read-Only Computed Property ............................. 261
Static Properties .............................................................. 259
Type Properties ................................................................ 259
Property Lists
propertyList-Methode ................................................. 740
PropertyListDecoder-Klasse .................................... 614
PropertyListEncoder-Klasse ..................................... 614
User-Defaults ...................................................... 577, 1061
protocol-Schlüsselwort ......................................... 306, 334
Protokolle ................................................................................. 304
erweitern ............................................................................. 328
Extensions .......................................................................... 323
für generische Typen .................................................... 312
nur für Klassen ................................................................. 307
optionale Regeln ............................................................ 310
Protocol Composition ................................................. 308
Standardprotokolle ...................................................... 314
Vererbung ........................................................................... 307
Prototypzellen ....................................................................... 635
Collection-View ............................................................... 665
Provisioning Profile ................................................ 400, 956
Proxy-Konfiguration (Vapor) .................................... 1038
Pseudo-3D ................................................................................ 803
public-Schlüsselwort ......................................................... 247
publicCloudDatabase-Eigenschaft ........................... 896
Pull to Refresh (Table-View) .......................................... 648
Punkt versus Pixel .............................................................. 417
Pyramide (Beispiel) ............................................................ 858
Q
qos-Parameter ....................................................................... 922
QR-Codes erkennen ........................................................... 799
Quality of Service (async-Methode) ............. 922, 924
Query-Klasse (Vapor/Fluent) ..................................... 1021
Queues (asynchrone Programmierung) .............. 923
R
Rückgabewerte (Funktionen) ...................................... 129
Radio-Stream abspielen .................................................. 769
radix-Parameter ................................................................... 166
raise-Methode ........................................................................ 349
RAM-Größe ermitteln ...................................................... 559
Rand eines Steuerelements .......................................... 413
Random Numbers .............................................................. 169
range-Methode (Zeichenketten) ................................ 188
Range-Operatoren ................................................................. 80
1296
�
�
“buch” — 2017/10/6 — 8:49 — page 1297 — #1293
�
�
�
�
�
�
Index
rangeOfCharacter-Methode .......................................... 187
rate-Eigenschaft .................................................................... 770
rawValue-Eigenschaft ....................................................... 251
Enumerationen .................................................................. 98
Read-Only-Eigenschaft .................................................... 261
readDataToEndOfFile-Methode ................................. 369
readLine-Funktion .............................................................. 147
readObjects-Methode ....................................................... 740
rear-Enumerationswert ................................................... 790
Rear-Kamera ........................................................................... 795
Rechenoperatoren ................................................................. 73
Record speichern (CloudKit) ........................................ 898
Record Zones (CloudKit) ................................................. 891
record-Methode .................................................................... 775
recordID-Eigenschaft ............................................. 891, 899
recordName-Eigenschaft .......................... 891, 899, 903
Records und Record Types (CloudKit) ................... 890
Redraw-Einstellung (contentMode) ........................ 698
reduce-Methode ................................................................... 224
mit inout-Parameter .................................................... 224
Refactoring .............................................................................. 977
Reference Counting ........................................................... 282
ReferenceWritableKeyPath-Klasse ........................... 333
Referenzen (CloudKit) ...................................................... 899
Referenztypen ............................................................... 72, 104
Reflection .................................................................................. 332
Regeln (Auto Layout) ......................................................... 417
register-Methode ...................................................... 530, 631
registerForDraggedTypes-Methode 729, 732, 1178
Reguläre Ausdrücke ........................................................... 189
Rekursion .................................................................................. 136
Enumerationen ............................................................... 253
indirekte Enumeration ............................................... 253
Verzeichnisbaum durchlaufen ............................... 592
Relationen (Vapor/Fluent) .......................................... 1021
reloadData-Methode .................................... 647, 660, 755
reloadRows-Methode ........................................................ 647
reloadRowsAtIndexPaths-Methode ...................... 1067
remove-Methode ...................................................... 213, 230
removeAllActions-Methode ......................................... 837
removeFirst-Methode ....................................................... 213
removeFromParent ............................................................ 836
removeFromSubview-Methode .............................. 1152
removeItem-Methode ...................................................... 593
removeItemAtPath-Methode ................................... 1190
removeLast-Methode ........................................................ 213
removeObserver-Methode ......................................... 1086
removeSubrange-Methode ........................................... 213
Renju ......................................................................................... 1127
repeat-Methode (SpriteKit-Aktionen) .................... 836
repeat-while-Schleife ........................................................ 119
repeatForever-Methode (SpriteKit) ............... 834, 836
REPL-Modus ............................................................................... 37
replaceCurrentItem-Methode ..................................... 768
replaceSubrange-Methode ................................. 188, 214
replacingOccurrences-Methode ..................... 188, 659
representedObject-Eigenschaft .................................. 514
Request-Klasse (Vapor) .................................... 1009, 1011
requestAlwaysAuthorization-Methode ...... 672, 679
requestRecordPermission-Methode ....................... 773
requestWhenInUseAuthorization-Methode ..... 672
required-Schlüsselwort ................................................... 295
reserveCapacity-Methode .............................................. 215
resignFirstResponder-Methode ................................. 539
Resistance Priority .............................................................. 438
resizeAspect-Konstante ................................................... 778
Resolve-Layout-Issues-Button .................................... 418
ResourceRepresentable-Protokoll ......................... 1022
Responder
Menüauswahl .................................................................. 546
Responderkette ................................................................ 544
Tastaturereignisse ......................................................... 538
Response-Klasse (Vapor) .............................................. 1009
ResponseRepresentable-Protokoll (Vapor) ...... 1009
Ressourcen ............................................................................... 584
REST-Konzept ......................................................................... 985
restitution-Eigenschaft ...................................... 857, 1201
reStructuredText-Kommentare .................................... 28
Restwert-Operator ................................................................. 73
resume-Methode ................................................................. 604
rethrows-Schlüsselwort ................................................... 350
Retroactive Modeling ....................................................... 322
return-Schlüsselwort ......................................................... 127
Reverse Polish Notation .................................................. 158
reverse-Methode .................................................................. 215
reversed-Methode ............................................................... 187
SpriteKit-Aktionen ......................................................... 836
Richtung zwischen zwei Punkten .......................... 1096
Right-Shift (bitweises Rechnen) .................................... 75
rightMouseDown-Methode .......................................... 718
rightMouseDragged-Methode .................................... 718
rightMouseUp-Methode ................................................. 718
Rollover (Picker-View) .................................................... 1121
Root manifest not found (Vapor) ........................... 1005
Root-View-Controller ............................................. 411, 416
rootViewController-Eigenschaft .......... 411, 416, 488
rotate-Methoden (SpriteKit-Aktionen) .................. 833
rotationRate-Eigenschaft ............................................... 828
round-Funktion .................................................................... 168
Routing (Vapor) .................................................................. 1008
rowHeightForComponent-Parameter ................ 1123
RPN-Rechner ........................................................................... 158
RSS-Datei auswerten ......................................................... 662
Ruby ............................................................................................. 361
run-Methode (SpriteKit) ....................................... 832, 837
runModal-Methode ................................................. 534, 535
1297
�
�
“buch” — 2017/10/6 — 8:49 — page 1298 — #1294
�
�
�
�
�
�
Index
S
SafariServices-Bibliothek ............................................... 622
Safe Area Layout Guides ....................................... 420, 432
SpriteKit ............................................................................... 809
safeAreaLayoutGuide-Eigenschaft ... 434, 809, 1197
Sandbox
iOS ........................................................................................... 587
macOS ................................................................................... 587
macOS, Icon-Resizer .................................................. 1170
save-Methode
CloudKit ............................................................................... 898
Vapor/Fluent .................................................................. 1021
scale-Methoden (SpriteKit-Aktionen) .................... 833
Scene-Editor ............................................................................ 865
SceneKit ..................................................................................... 803
Schalter (UISwitch-Steuerelement) .......................... 709
Schatzsuche .......................................................................... 1075
scheduledTimer-Methode ............................................. 925
Schlüssel-Wert-Paare ......................................................... 226
Schlüsselwörter als Variablennamen ........................ 94
Schleifen .................................................................................... 117
abbrechen (break) .......................................................... 119
nicht-triviale Schleifen ................................................ 121
Schnittstelle ............................................................................ 304
Schrift auswählen ................................................................ 533
Schriftattribute ändern ................................................... 532
Schwerkraft (SpriteKit) ..................................................... 841
Screenshots (Apple TV) .................................................... 557
scrollPosition-Parameter (Table-View) .................. 634
scrollToRow-Methode ......................................... 647, 1066
scrollXxx-Methoden (NSEvent) .................................. 540
SearchPathDirectory-Enumeration ......................... 587
SearchPathDomainMask-Struktur ........................... 587
seek-Methode (AVPlayer) ................................................ 780
Segues ......................................................................................... 460
Datenübergabe ............................................................... 522
Datenübertragung ........................................................ 465
macOS ................................................................................... 521
per Code initiieren ......................................................... 469
Popover ................................................................................ 493
Unwind ...................................................................... 462, 467
verhindern .......................................................................... 468
vonMenüeinträgen ...................................................... 548
Selected-Image-Eigenschaft ......................................... 479
selectedIndex-Eigenschaft ............................................. 482
selectedRow-Eigenschaft ................................................ 660
selectedViewController-Eigenschaft ....................... 482
selectRow-Eigenschaft .................................................. 1120
selectRow-Methode ............................................................ 634
selectXxx-Methoden (NSEvent) ................................. 540
Selektor .............................................................. 433, 553, 1063
Syntax ....................................................................... 277, 433
self-Schlüsselwort ............................................................... 246
bei Enumerationen .................................................... 1130
in Closures .......................................................................... 157
in MutatingMethods ................................................... 274
Klassentyp .......................................................................... 320
Self-Schlüsselwort ............................................................... 246
Protokolle ................................................................ 307, 316
Selfie-Kamera ......................................................................... 795
sequence-Methode (SpriteKit-Aktionen) ............. 836
Sequence-Protokoll ............................................................ 117
Serielle Queues ..................................................................... 923
Server-APIs-Bibliothek ..................................................... 992
Server-side Swift ................................................................... 985
sessionDidUpdate-Parameter ..................................... 747
Set-Datentyp ........................................................................... 230
Option-Sets ........................................................................ 231
uniqueSet-Methode ...................................................... 330
set-Methode (Key/Value-Speicher) ........................... 883
set-Schlüsselwort .............................................. 96, 259, 279
setAction-Methode (NSColorPanel) ........................ 537
setActive-Methode (AVAudioSession) .................... 773
setCategory-Methode ....................................................... 773
setDataSouce-Methode ................................................... 656
setDelegate-Methode ........................................................ 656
setEditing-Methode .............................................. 648, 1063
setFill-Methode ....................................................... 691, 1086
setLineDash-Methode ...................................................... 692
setNeedsDisplay-Methode ......... 694, 724, 733, 1148
setNeedsFocusUpdate-Methode .................. 571, 1277
setObject-Methode .......................................................... 1111
CloudKit ............................................................................... 898
setRegion-Methode ............................................................ 680
setSelectedFont-Methode .............................................. 536
setStroke-Methode ................................................ 691, 1086
setTarget-Methode (NSColorPanel) ......................... 537
setTitle-Methode ............................................................... 1063
setVolume-Methode .......................................................... 761
SFSafariViewController-Klasse ................................... 622
Shapes (SpriteKit) ................................................................ 816
Shared Init-Funktion ......................................................... 296
shared-Eigenschaft .................................................. 536, 537
shared-Methode ................................................................... 416
sharedApplication-Methode .......................... 517, 1179
sharedWorkspace-Methode ....................................... 1179
shift-Eigenschaft .................................................................. 720
Short-Circuit Evaluation .................................................... 80
Shortest Path Algorithm .............................................. 1242
shouldAutorotate-Eigenschaft ................................... 812
shouldChangeCharactersInRange-Parameter 1117
shouldPerformSegue-Methode .................................. 468
shouldUseExtendedBackgroundIdleMode-
Eigenschaft .................................................................... 605
showDetailViewController-Methode ..................... 489
1298
�
�
“buch” — 2017/10/6 — 8:49 — page 1299 — #1295
�
�
�
�
�
�
Index
showPhysics-Eigenschaft ............................................... 842
showWindow-Methode ................................................... 525
Shuffle-Algorithms ............................................................. 225
Signatur vonMethoden ....................................... 276, 433
Simulator (iOS) ...................................................................... 378
GPS-Funktionen .............................................................. 675
Singleton-Muster ................................................................. 259
size-Eigenschaft .................................................................... 719
SpriteKit ............................................................................... 815
sizeThatFits-Methode ....................................................... 497
sizeToFit-Methode .............................................................. 453
SKAction-Klasse .................................................................... 832
SKEmitterNode-Klasse ..................................................... 872
SKLabelNode-Eigenschaft .............................................. 818
SKPhysicsBody-Klasse ...................................................... 842
SKPhysicsContact-Klasse ................................................ 845
SKPhysicsContactDelegate-Protokoll ....... 841, 1204
SKPhysicsWorld-Klasse .................................................... 841
visualisieren ...................................................................... 842
SKScene-Klasse ...................................................................... 808
in eine andere Szene wechseln ............................... 868
Scene-Editor ...................................................................... 865
SKShapeNode-Klasse ......................................................... 816
SKSpriteNode-Klasse ......................................................... 810
SKTransition-Klasse ........................................................... 868
SKU (Stock Keeping Unit) ............................................... 960
SKView-Klasse ........................................................................ 847
sleep-Funktion ...................................................................... 926
Slices (Arrays) ......................................................................... 212
sort-Methode ............................................................... 185, 214
für NSTableView .............................................................. 659
sortDescriptors-Eigenschaft ........................................ 659
CloudKit ............................................................................... 902
sortDescriptorsDidChange-Parameter ................. 659
sorted-Methode .................................................................... 214
sortedArray-Methode ....................................................... 659
Sortieren (CloudKit) ........................................................... 902
Sortierordnung für Zeichenketten ........................... 186
Source Control ....................................................................... 973
sourceOperationMaskFor-Parameter .................... 730
sourceOperationMaskForDraggingContext-
Parameter .......................................................... 736, 1185
sourceRect-Eigenschaft ................................................... 499
sourceType-Eigenschaft ................. 781, 784, 788, 790
sourceView-Eigenschaft .................................................. 499
spacing-Eigenschaft ........................................................... 436
spctl-Kommando ................................................................. 967
speed-Eigenschaft ............................................................... 858
Speicherplatz ermitteln ................................................... 559
Speicherverwaltung ........................................................... 282
Spinner-Steuerelement ................................................... 920
split-Methode ............................................................. 192, 224
Split-View-Controller ............................. 482, 1167, 1168
Delegation ....................................................................... 1181
NYT-Beispiel .................................................................... 1053
Splitter-Steuerelement .................................................... 529
splitView-Methode .......................................................... 1181
splitViewController-Methode ..................................... 490
SpriteKit ..................................................................................... 803
SQLite (Vapor) ..................................................................... 1025
sqlite.json-Datei (Vapor) ............................................... 1025
srand48-Funktion .................................................. 169, 1134
SSLHandshake failed (NSURL-Klasse) ..................... 602
Stack-Button ........................................................................... 418
Stack-Speicher ....................................................................... 137
Stack-View ................................................................................ 435
Animationen ..................................................................... 709
rückgängig machen ..................................................... 392
Standarddialoge ................................................................... 533
iOS ........................................................................................... 503
Standardfunktionen .......................................................... 145
standardOutput-Eigenschaft ....................................... 369
Standardprotokolle ............................................................ 314
standardUserDefaults-Methode ................................ 530
startAccelerometerUpdates-Methode ................... 827
Startansicht ............................................................................. 939
startDeviceMotionUpdates-Methode .................... 827
startGyroUpdates-Methode ......................................... 827
startIndex-Eigenschaft ..................................................... 193
startRunning-Methode .................................................... 794
starts-Methode ...................................................................... 219
startUpdatingHeading-Methode .............................. 683
startUpdatingLocation-Methode .............................. 679
state-Eigenschaft ...................................... 550, 1064, 1189
Static Properties ................................................................... 259
static-Schlüsselwort ........................................................... 275
Statische Methoden ........................................................... 275
Statusbar ........................................................................ 552, 812
anzeigen .............................................................................. 438
statusItem-Methode .......................................................... 553
Steuerelemente
ein- und ausblenden ..................................................... 709
selbst programmieren ................................................. 687
stop-Methode ......................................................................... 759
Stored Properties ................................................................. 254
Storyboard
Fenster per Code erzeugen ........................................ 525
iOS ................................................................................ 375, 376
macOS ................................................................................... 519
storyboard-Eigenschaft ................................................... 525
stride-Funktion ..................................................................... 125
String-Datentyp .................................................................... 179
Interpolation .......................................................... 181, 197
als Datei lesen/schreiben ........................................... 595
Konstruktor ....................................................................... 166
1299
�
�
“buch” — 2017/10/6 — 8:49 — page 1300 — #1296
�
�
�
�
�
�
Index
string-Methode
DateFormatter ................................................................. 203
NumberFormatter ......................................................... 199
String.Index-Datentyp ..................................................... 193
stringByAppendingPathComponent-
Methode ........................................................................ 1190
stringValue-Eigenschaft ....................................... 516, 658
stroke-Methode ................................. 691, 722, 733, 1086
strokeColor-Eigenschaft .................................................. 816
strong-Schlüsselwort ........................................................ 283
struct-Schlüsselwort .......................................................... 244
Strukturen ................................................................................ 242
verschachteln ................................................................... 249
styleMask-Eigenschaft .......................................... 523, 524
Subclassing .............................................................................. 287
Subscriptions (CloudKit) ................................................. 891
Subscripts ................................................................................. 278
bequemer Zeichenkettenzugriff ............................ 195
Fehler auslösen ................................................................ 349
Substring-Struktur ............................................................. 195
Substrings lesen ................................................................... 193
subtract-Methode ................................................................ 167
subtracting-Methode ........................................................ 167
subviews-Eigenschaft .................................................... 1145
Suchen und Ersetzen in Zeichenketten ................ 188
suffix-Methode ..................................................................... 218
super-Schlüsselwort .......................................................... 291
supportedFlashModes-Eigenschaft ......................... 796
supportedInterfaceOrientation-Eigenschaft .... 812
swap-Funktion ....................................................................... 147
swapAt-Methode ....................................................... 147, 214
Swift
Compiler ................................................................................. 38
Interpreter ............................................................................. 37
Package Manager .......................................................... 993
Playgrounds für das iPad ............................................. 39
Versionstest ....................................................................... 116
swift-Schlüsselwort ................................................. 146, 176
swiftdoc-Dateien .................................................................. 360
swiftmodule-Dateien ........................................................ 360
Swipe Gesture Recognizer ............................................. 726
switch-Verzweigungen ..................................................... 112
Enumeration ..................................................................... 252
Tupel ...................................................................................... 234
sync-Methode ........................................................................ 926
synchronize-Methode (iCloud) ................................... 883
Syntaktischer Zucker
Generics ............................................................................... 301
Optionals ............................................................................. 104
Synthesized Headers ......................................................... 972
systemd-Service (Vapor) ............................................... 1039
systemFreeSize-Konstante ............................................ 560
Systemfunktionen aufrufen ......................................... 369
Systemklänge abspielen .................................................. 768
systemSize-Konstante ...................................................... 560
systemStatusBar-Methode ............................................ 553
systemVersion-Eigenschaft .......................................... 559
Szene (iOS) ............................................................................... 376
T
Tab-Bar-Controller .............................................................. 476
Tab-Bar-Items ......................................................................... 477
Tab-View-Controller ........................................................... 526
tabBarController-Eigenschaft ...................................... 481
Table-View-Steuerelement
individuelle Zellengestaltung ................................. 640
iOS ........................................................................................... 629
Listeneintrag per Code auswählen ...................... 634
macOS ................................................................................... 650
Prototypzellen .................................................................. 635
Pull to Refresh .................................................................. 648
Reaktion auf Elementauswahl ............................... 634
veränderliche Listen ..................................................... 647
Zellenhöhe einstellen ................................................... 644
tableFooterView-Eigenschaft ....................................... 635
tableView-Methoden ........................ 632, 652, 657, 753
Icon-Resizer-Beispiel ................................................. 1182
tableViewSelectionDidChange-Methode ............. 660
Tag-Eigenschaft (Tab-Bar-Item) .................................. 479
Tap Gesture Recognizer ................................................ 1118
Targets (Xcode) ................................................................... 1249
Tastatur (iOS) .............................................................. 379, 448
ausblenden ........................................................... 452, 1118
einblenden ....................................................................... 1069
Tastaturfokus setzen ...................................... 452, 1092
Tastatur (macOS) .................................................................. 538
Teilzeichenketten extrahieren .................................... 193
TelevisionMarkup Language ....................................... 555
Temporäre Datei .................................................................. 588
Temporäres Verzeichnis .................................... 588, 1190
Inhalt löschen ................................................................... 784
terminate-Methode .............................................. 517, 1179
terminator-Parameter ...................................................... 147
Ternärer Operator .................................................................. 84
Beispiel ...................................................... 710, 1148, 1158
Terrains (in Tiled) .............................................................. 1213
testable-Attribut ........................................................ 248, 365
Testflight ................................................................................... 892
Textdateien .............................................................................. 595
Texteingaben (iOS) .............................................................. 448
textField-Methode ................................................. 451, 1117
textFieldShouldReturn-Methode .............................. 450
textLabel-Eigenschaft ....................................................... 636
Textur
Atlas .......................................................................... 833, 1209
SpriteKit ............................................................................... 811
1300
�
�
“buch” — 2017/10/6 — 8:49 — page 1301 — #1297
�
�
�
�
�
�
Index
Textured Button ................................................................ 1168
throws-Schlüsselwort ....................................................... 346
bei Funktionsparametern ......................................... 350
Eigenschaften und Subscripts ................................ 349
in Init-Funktionen .......................................................... 347
Tilde-Operator (binäre Inversion) ................................ 75
Tiled Textures ........................................................... 815, 1210
Tiled-Programm ................................................................ 1210
Tilemaps ................................................................................. 1210
Tileset ....................................................................................... 1211
timeIntervalSince-Methode ......................................... 205
Timer-Klasse ........................................................................... 925
AVAudioRecorder-Beispiel ......................................... 776
Tint-Color (SFSafariViewController) ........................ 626
titleForRow-Parameter ................................................. 1122
TLSv1.2-SSL-Verschlüsselung für NSURL ............... 602
To-do-Liste ............................................................................. 1060
iCloud-Variante ............................................................ 1070
REST-API (Vapor) .......................................................... 1013
Token (Vapor-Authentifizierung) ........................... 1030
Tool-Tipps .............................................................................. 1169
Toolbox (Vapor) .................................................................... 995
Top Layout Guide ................................................................. 432
Top Shelf Image (tvOS) ..................................................... 946
topViewController-Eigenschaft .................................. 488
touches-Methoden .................................................. 712, 819
Asteroids-Beispiel ........................................................ 1268
Breakout-Spiel ............................................................... 1202
Kanonenkugel-Beispiel ............................................... 862
Pac-Man-Beispiel ......................................................... 1230
tvOS ........................................................................................ 562
touchesBegan-Methode ............................................... 1153
touchesEnded-Methode ............................................... 1153
Trackpad .................................................................................... 718
Trailer-Beispiel ....................................................................... 661
Trailing Closures .................................................................. 155
Trailing-constraint-Warnung ....................................... 431
Traits (Auto Layout) ............................................................ 440
traits-Methode ...................................................................... 536
Transaktionen (CloudKit) ............................................... 891
translatesAutoresizingMaskIntoConstraints-
Eigenschaft .................................................................... 433
Transparenz ............................................................................ 708
trashDirectory-Konstante .............................................. 587
trashItem-Methode ............................................................ 593
trimmingCharacters-Methode ................................... 186
true ................................................................................................ 170
truncatingRemainder-Methode ............................. 1215
try-catch-Konstruktion .................................................... 337
Forced Try ........................................................................... 343
mit do-catch ...................................................................... 338
ohne do-catch .................................................................. 342
Optional Try ...................................................................... 343
Tupel ............................................................................................ 233
als Rückgabewert von Funktionen ...................... 130
in switch-Konstruktionen ......................................... 114
switch-Auswertung ....................................................... 234
TVML-Apps ............................................................................... 555
tvOS .............................................................................................. 555
Asteroids-Spiel .............................................................. 1255
Bewegungssteuerung .................................... 830, 1269
Pac-Man ............................................................................ 1249
touch-Ereignisse ............................................................. 823
Versionsnummer ermitteln ...................................... 559
Videos abspielen ............................................................. 778
Type Annotation ..................................................................... 94
Type Constraints .................................................................. 302
Type Properties ..................................................................... 259
type-Funktion ............................................................. 333, 334
Type-Schlüsselwort ............................................................ 334
typealias-Schlüsselwort ................................................... 281
AnyClass-Datentyp ....................................................... 320
Generics ............................................................................... 304
Typen
Aliasse ................................................................................... 281
Enumerationen ............................................................... 250
Klassen und Strukturen .............................................. 242
Metatypen .......................................................................... 334
Referenz- und Werttypen ........................................... 104
Typmethoden ........................................................................ 275
U
Ubuntu ....................................................................................... 988
Uhrzeit ........................................................................................ 203
UIActionController-Klasse ......................................... 1099
UIActivityIndicatorView-Steuerelement ............. 920
UIAlertAction-Klasse ......................................................... 504
UIAlertController-Klasse ................................................ 503
UIApplication-Eigenschaft ............................................ 416
UIApplication-Klasse .............................................. 415, 622
UIApplicationDelegate-Protokoll ............................. 415
UIApplicationMain-Attribut .............................. 365, 415
UIBarButtonItem-Klasse ................................................. 472
UIBarButtonItem-Steuerelement ............................. 473
UIBezierPath-Klasse .......................................................... 860
Beispiel Kompass ............................................................ 694
Beispiel Richtungsanzeige ..................................... 1086
Grundlagen ........................................................................ 691
UIButton-Steuerelement ................................................ 433
UICollectionView-Steuerelement ............................. 661
Beispiel zur Farbauswahl .......................................... 886
UIColor-Klasse ....................................................................... 413
Assets verwenden .......................................................... 586
erweitern .......................................................................... 1132
UIDevice-Klasse ......................................................... 447, 559
UIDeviceOrientationDidChange-Konstante ...... 447
1301
�
�
“buch” — 2017/10/6 — 8:49 — page 1302 — #1298
�
�
�
�
�
�
Index
UIDeviceOrientationDidChange-Nachricht ...... 699
UIDocument-Klasse ........................................................... 877
UIDocumentBrowserViewController-Klasse ..... 877
UIDragInteraction-Klasse .................................... 745, 746
UIDragInteractionDelegate-Protokoll ......... 743, 746
UIDragItem-Klasse ........................................ 743, 746, 753
UIDragSession-Klasse ............................................ 743, 746
UIDropInteraction-Klasse .............................................. 748
UIDropInteractionDelegate-Protokoll ................... 743
UIDropProposal-Klasse ......................................... 747, 748
UIDropSession-Klasse ...................................................... 748
UIEdgeInsets-Klasse .......................................................... 809
UIFocusUpdateContext-Klasse ................................... 571
UIFont-Klasse ......................................................................... 397
UIGestureRecognizer-Klasse ....................................... 725
UIGestureRecognizerDelegate-
Protokoll .......................................................... 1062, 1118
UIGraphicsGetCurrentContext-Methode ............ 702
UIGraphicsImageRenderer-Klasse ........................... 705
UIImage-Klasse ..................................................................... 639
Assets verwenden .......................................................... 585
Bild herunterladen ........................................................ 602
UIImagePickerController-Klasse .................... 781, 788
UIImageView-Klasse
eigener Renderer-Code ................................................ 705
Instanz per Code erzeugen .................................... 1122
UIImageView-Steuerelement .............. 457, 642, 1104
UIKit-Framework ................................................................. 409
UILabel-Klasse .................................................................... 1122
mehrzeiliger Text ........................................................... 453
UILongPressGestureRecognizer-Klasse 1062, 1064
UINavigationController-Klasse .................................. 471
Beschriftung ändern ..................................................... 474
Navigation per Code .................................................... 474
UInt-Datentyp ....................................................................... 166
UIPasteConfiguration-Klasse ....................................... 745
UIPickerView-Steuerelement ...................... 1106, 1119
Rollover ............................................................................. 1121
UIPickerViewDataSource-Protokoll ...................... 1121
UIPickerViewDelegate-Protokoll ............................ 1121
UIPopoverPresentationControllerDelegate-
Protokoll .......................................................................... 495
UIRefreshControl-Klasse ................................................ 649
UIScreen-Klasse .................................................................... 408
UISplitViewController-Klasse ...................................... 482
NYT-Beispiel .................................................................... 1053
UISplitViewControllerDelegate-Protokoll ........... 490
UIStackView-Steuerelement .............................. 418, 435
UIStoryboardSegue-Klasse ............................................ 467
UISwipeGestureRecognizer-Klasse .......................... 726
UISwitch-Steuerelement ................................................. 709
UITabBarController-Klasse ............................................ 476
UITabBarControllerDelegate-Protokoll ................. 481
UITabBarItem-Klasse ......................................................... 477
UITableView-Steuerelement ........................................ 629
Delete on Swipe ............................................................ 1067
Drag&Drop ...................................................................... 749
individuelle Zellengestaltung ................................. 640
Prototypzellen .................................................................. 635
Pull to Refresh .................................................................. 648
veränderliche Listen ..................................................... 647
Zellenhöhe einstellen ................................................... 644
UITableViewCell-Klasse ................... 631, 632, 642, 644
UITableViewCellStyle-Enumeration ........................ 636
UITableViewController-Klasse .................................... 630
UITableViewDataSource-Protokoll .......................... 632
UITableViewDelegate-Protokoll ...................... 634, 644
UITableViewDragDelegate-Protokoll ...................... 753
UITableViewDropCoordinator-Protokoll ............. 754
UITableViewDropDelegate-Protokoll ..................... 753
UITableViewDropProposal-Klasse ............................ 753
UITapGestureRecognizer-Klasse ............................ 1118
UITextField-Steuerelement ........................................... 448
EditingChanged-Ereignis ........................................ 1118
ValueChanged-Ereignis ........................................... 1118
UITextFieldDelegate-Protokoll ................................... 450
UITextView-Steuerelement ........................................... 413
UITouch-Klasse ............................................. 712, 819, 1153
UIView-Klasse ................................................ 408, 688, 1086
Größenänderung feststellen ................................. 1153
Instanz per Code erzeugen .................................... 1122
UIViewController-Klasse ...................................... 408, 410
Lebenszyklus ..................................................................... 410
UIWebView-Steuerelement ........................................... 622
NYT-Bestseller-App ..................................................... 1052
UIWindow-Klasse ..................................................... 407, 416
Umrandung eines Steuerelements .......................... 413
Unärer Operator ...................................................................... 84
Unable to simultaneously satisfy constraints
(Fehlermeldung) ......................................................... 433
Unbenannte Parameter ................................................... 139
Unicode
Skalar .................................................................................... 183
Textdateien ........................................................................ 595
unicodeScalars-Eigenschaft .......................................... 191
Beispiel .................................................................................. 264
Uniform Resource Locator ............................................ 582
uniqueKeysWithValues-Parameter ......................... 227
uniqueSet-Methode ........................................................... 330
uniquingKeys-Parameter (Dictionary) .................. 228
unlockFocus-Methode ................................................... 1173
unlockForConfiguration-Methode .......................... 800
unowned-Schlüsselwort ................................................. 283
unowned self in Closures ................................ 161, 707
unrecognized-selector-Fehler ..................................... 386
unregisterDraggedTypes-Methode ....................... 1178
1302
�
�
“buch” — 2017/10/6 — 8:49 — page 1303 — #1299
�
�
�
�
�
�
Index
UnsafeMutablePointer-Struktur ............................... 367
Unwind Segues ........................................................... 462, 467
Popups .................................................................................. 501
Unwrapping-Operator .............................................. 85, 101
Upcast ......................................................................................... 297
updateFocusIfNeeded-Methode ................... 571, 1277
uppercased-Methode ........................................................ 186
URL-Klasse .................................................................. 601, 1108
url-Methode (Bundle-Datei) ......................................... 585
URL-Struktur .......................................................................... 582
URLForRessource-Methode .......................................... 530
URLRequest-Klasse ............................................... 622, 1052
URLs-Eigenschaft ................................................................. 535
urls-Methode (FileManager) ......................................... 587
urlSession-Delegate-Methoden ................................. 606
URLSession-Klasse .............................................................. 604
URLSessionDownloadDelegate-Protokoll ........... 604
URLSessionDownloadTask-Klasse ............................ 604
useGroupingSeparator-Eigenschaft ........................ 199
User-Defaults .................................................... 530, 577, 577
Asteroids-Spiel ............................................................... 1274
Beispiel ............................................................................... 1061
Defaultwerte ..................................................................... 530
iOS ........................................................................................... 577
macOS ................................................................................... 530
Währungsumrechner ................................................ 1111
userAcceleration-Eigenschaft ..................................... 828
userDirectory-Konstante ................................................ 587
userDomainMask-Konstante ...................................... 587
userInitiated-Enumerationswert .............................. 922
usesGroupingSeparator-Eigenschaft ................... 1115
usesPreciseCollisionDetection-Eigenschaft ....... 857
utf16-Eigenschaft ................................................................. 192
UTF8
Textdateien ........................................................................ 595
Zeichenketten ................................................................... 179
utf8-Eigenschaft ............................................................. 192
utf8-Konstante ................................................................. 201
UUIDs erzeugen ................................................................... 588
uuidString-Eigenschaft .................................................... 588
V
validateMenuItem-Methode ........................................ 550
values-Eigenschaft .............................................................. 229
Vapor-Framework ................................................................ 986
Docker ................................................................................ 1003
HelloWorld ........................................................................ 996
Installation ........................................................................ 995
vapor-Kommando ............................................................... 995
var-Schlüsselwort ................................................................... 93
in switch-Konstruktionen ......................................... 114
mit if ....................................................................................... 108
mit while .............................................................................. 119
Variablen ...................................................................................... 93
Variablennamen ................................................................ 94
Variadics ..................................................................................... 144
Vary for Traits ......................................................................... 444
velocity-Eigenschaft .......................................................... 857
Veränderliche Parameter ................................................ 142
Vererbung ................................................................................. 287
bei Steuerelementen ..................................................... 687
eigene UIView-Klasse ................................................... 688
Protokolle ........................................................................... 307
Vergleichsoperatoren .......................................................... 76
Verschachtelte Funktionen ........................................... 135
Versionsabhängiger Code .............................................. 115
Versionsnummer ermitteln (iOS/tvOS) ................ 559
verticalAlignmentMode-Eigenschaft ..................... 818
Verzeichnisse
auswählen ............................................................ 533, 1179
ermitteln .............................................................................. 586
erzeugen ........................................................................... 1191
Größe rekursiv ermitteln ........................................... 592
löschen ............................................................................... 1190
Inhalt auflisten ................................................................ 589
temporäres Verzeichnis ........................................... 1190
Verzeichnistest ................................................................. 591
Verzweigungen ...................................................................... 107
videoGravity-Eigenschaft ............................................... 778
Videos
abspielen ............................................................................. 777
aufnehmen ........................................................................ 783
auswählen .......................................................................... 781
YouTube ............................................................................... 785
View
Größe fixieren ................................................................... 523
schließen (macOS) ......................................................... 524
View-Controller .......................................................... 410, 508
Root-View-Controller ........................................ 411, 416
view-Eigenschaft ....................................................... 433, 553
viewControllers-Eigenschaft ............................. 481, 488
viewDidAppear-Methode .................................... 411, 524
Animationen ..................................................................... 708
macOS ................................................................................... 888
viewDidDisappear-Methode ................ 411, 517, 1179
viewDidLayoutSubviews-Methode .......................... 411
viewDidLoad-Methode .................................................... 413
Animationen ..................................................................... 708
macOS ................................................................................... 514
viewForTableColumn-Parameter .............................. 657
viewWillAppear-Methode ................................... 411, 473
viewWillDisappear-Methode ............... 411, 473, 1097
viewWillLayoutSubviews-Methode ......................... 411
Volltextsuche (CloudKit) ................................................. 901
Volumes (Docker) ................................................................ 990
Volumes (SpriteKit) ............................................................ 856
1303
�
�
“buch” — 2017/10/6 — 8:49 — page 1304 — #1300
�
�
�
�
�
�
Index
W
wait-Methode (SpriteKit-Aktionen) ......................... 836
WAV-Format ............................................................................ 759
weak-Schlüsselwort ............................................................ 283
Beispiel ....................................................................... 382, 522
Web-View ................................................................................... 622
Beispiel ............................................................................... 1052
NYT-Bestseller-App ..................................................... 1052
WebKit-Bibliothek ............................................................... 622
Webseiten anzeigen ........................................................... 621
im Browser ......................................................................... 621
in der App ............................................................................ 622
Werttypen ......................................................................... 72, 104
where-Schlüsselwort
Protokollerweiterungen ............................................. 329
Regeln für generische Datentypen ...................... 302
switch/case ......................................................................... 114
while-Schleife ......................................................................... 118
let (Optionals) ........................................................ 119, 188
width-Eigenschaft ............................................................... 719
Wildcard-Pattern-Zeichen ................................................. 72
Willkommensbildschirm ............................................... 939
willSet-Funktion ........................................................ 257, 290
Window-Controller ............................................................. 508
window-Eigenschaft ..................................... 416, 524, 553
with-Funktion
SpriteKit ............................................................................... 844
UIBezierPath ..................................................................... 697
withSize-Methode ............................................................... 397
WKWebView-Klasse ............................................................ 622
NYT-Beispiel .................................................................... 1056
write-Methode ......................................................... 595, 1111
write-Methode (Data-Struktur) ................................ 1081
writeToFile-Methode ......................................................... 355
Wuziqi ...................................................................................... 1127
X
x-Eigenschaft .......................................................................... 719
Xcassets-Datei ............................................................. 455, 584
Spritekit ................................................................................ 813
UIImage-Objekt erzeugen ......................................... 639
URL von Bild erzeugen ................................................ 899
Xcode .............................................................................................. 22
Arbeitstechniken ............................................................. 971
Code-Konverter ................................................................... 67
Crashkurs ............................................................................... 58
Crashlogs ............................................................................ 976
erste Schritte ........................................................................ 31
für Server-Projekte ...................................................... 1002
Git ............................................................................................ 973
Hello iOS-World ............................................................... 374
Literale .................................................................................. 811
mehrsprachige Apps ..................................................... 947
Projekte umbenennen ................................................. 978
Refactoring ........................................................................ 977
Verzeichnisse aufräumen .......................................... 979
XIB-Datei ................................................................................... 412
XLIFF-Dateien ......................................................................... 951
XML-Bibliothek .................................................................. 1107
XML-Daten verarbeiten ................................................... 610
XMLAttribute-Klasse ......................................................... 610
XMLElement-Klasse ........................................................... 610
XMLIndexer-Klasse ............................................................ 610
XMLParser-Klasse ................................................................ 610
XWXMLHash-Bibliothek ................................................. 610
Y
y-Eigenschaft .......................................................................... 719
youtube-ios-player-helper-Bibliothek ................... 785
YouTube-Videos abspielen ............................................ 785
YTPlayerView-Klasse .......................................................... 786
YTPlayerViewDelegate-Protokoll ............................... 787
Z
Zahlen ......................................................................................... 166
Zeichenketten ........................................................................ 179
als Datei lesen/schreiben ........................................... 595
Copy-on-Write .................................................................. 183
in Data-Element umwandeln ................................. 617
Länge ..................................................................................... 184
sortieren .............................................................................. 185
Substrings bequemer lesen ...................................... 195
Substrings lesen .............................................................. 193
Teilzeichenketten extrahieren ................................ 193
vergleichen ......................................................................... 185
zeilenweise zerlegen ..................................................... 369
Zeit ................................................................................................ 203
messen .................................................................................. 205
vergleichen ......................................................................... 206
Zeit formatieren ................................................................... 776
Zellenhöhe einstellen (Table-View) .......................... 644
zero-Eigenschaft ................................................................... 173
zip-Funktion ................................................................. 148, 227
Zip2Sequenz-Datentyp .................................................... 148
Zonen (CloudKit) .................................................................. 891
zPosition-Eigenschaft ....................................................... 811
zRotation-Eigenschaft ...................................................... 815
Zufallszahlen .......................................................................... 169
Zugriffsebenen ...................................................................... 246
Zuweisung ................................................................................... 72
Zweidimensionale Arrays ........................................... 1132
Zweinamige Parameter ................................................... 140
1304
Wissen, wie’s geht.
Wir hoffen sehr, dass Ihnen diese Leseprobe gefallen hat. Gerne dürfen Sie diese Leseprobe empfehlen und weitergeben, aller-dings nur vollständig mit allen Seiten. Die vorliegende Leseprobe ist in all ihren Teilen urheberrechtlich geschützt. Alle Nutzungs- und Verwertungsrechte liegen beim Autor und Verlag.
Teilen Sie Ihre Leseerfahrung mit uns!
Michael Kofler
Swift 4 – Das umfassende Handbuch
1.304 Seiten, gebunden, Oktober 2017 49,90 Euro, ISBN 978-3-8362-5920-0
www.rheinwerk-verlag.de/4494
Michael Kofler hat Telematik an der TU Graz studiert. Er zählt zu den erfolgreichsten und vielseitigsten Com-puterbuchautoren im deutschen Sprachraum. Zu sei-nen Themengebieten zählen neben Java auch Linux, OS X, der Raspberry Pi, MySQL, KVM, Visual Basic und Excel-VBA. Viele seiner Bücher wurden übersetzt. Michael Kofler arbeitet auch als Software-Entwickler, Berater sowie als Lehrbeauftragter an zwei Fachhoch-schulen.
Wissen, wie’s geht.