ios-apps mit swift 21).pdf · inhaltsverzeichnis 11 25.5 zweite szene: die detailansicht. . . . . ....
Post on 27-Jan-2021
2 Views
Preview:
TRANSCRIPT
-
5
Inhaltsverzeichnis
Danksagung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15An wen richtet sich das Buch? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Aufbau des Buches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Teil I: Grundlagen der Sprache Swift . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Teil II: iOS-Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Swift ist nicht Objective-C Version 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . 21
Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Stilmittel in den Listings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Die Frameworks der Apple-Plattformen . . . . . . . . . . . . . . . . . . . . . . . . 24
Die Installation von Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Die Entwickler-Community von Apple . . . . . . . . . . . . . . . . . . . . . . . . . 28
Webseite und Downloads zum Buch. . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Teil I Grundlagen der Sprache Swift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1 Datentypen und Optionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.1 Willkommen auf dem Spielplatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.2 Variablen und Konstanten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331.3 Zahlendatentypen konvertieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381.4 Werte runden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411.5 Minimum und Maximum. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421.6 Der Datentyp Bool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431.7 Optionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441.8 Programmieren mit Optionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2 Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492.1 String Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502.2 Zeichenketten vergleichen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522.3 Textabschnitte finden und ersetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . 542.4 Zeichenketten in Zahlentypen konvertieren . . . . . . . . . . . . . . . . . . . . 57
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Inhaltsverzeichnis
6
2.5 Die Klasse NSNumber. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602.6 Texte teilen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612.7 Subscripting mit Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632.8 Anfang und Ende von Zeichenketten. . . . . . . . . . . . . . . . . . . . . . . . . . 65
3 Arrays und Dictionaries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.1 Arrays – Listen von Elementen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.2 Arrays sortieren und filtern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713.3 Dictionaries, die schnellen Wörterbücher . . . . . . . . . . . . . . . . . . . . . . 733.4 Arrays aus Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4 Fallunterscheidungen und Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . 794.1 Die if-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794.2 Die switch-case-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854.3 Die for-Schleife. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884.4 Schleifen und Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904.5 Rückwärts durch die for-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914.6 Die while-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934.7 Schleifen mit Fallunterscheidungen . . . . . . . . . . . . . . . . . . . . . . . . . . 944.8 Werte als Diagramme anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974.9 Gültigkeitsbereiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5 Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035.1 Die erste Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035.2 Benannte Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1075.3 Funktionen mit Rückgabewert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1095.4 Tupel und anonyme Typen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1115.5 Eine unbestimmte Anzahl von Parametern. . . . . . . . . . . . . . . . . . . . . 1145.6 Funktionen mit Standardwerten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175.7 Parameter sind unveränderlich. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195.8 Aliasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
6 Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1256.1 Closures sind Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1256.2 Closures als Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1276.3 Arrays sortieren mit Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1316.4 Variablen einfangen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1356.5 Asynchrone Closures mit Grand Central Dispatch . . . . . . . . . . . . . . . 1386.6 Parallele Verarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1416.7 Asynchrone Aufrufe mittels Completion-Handler . . . . . . . . . . . . . . . 143
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Inhaltsverzeichnis
7
7 Klassen und Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1477.1 Das erste Projekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1477.2 Erste Schritte im Workspace-Fenster . . . . . . . . . . . . . . . . . . . . . . . . . . 1507.3 Die Klasse Person . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1537.4 Von der Klasse zum Objekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1557.5 Eigenschaften und Punktnotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1567.6 Berechnete Eigenschaften mit Getter und Setter . . . . . . . . . . . . . . . . 1577.7 Eigenschaften beobachten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
8 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1678.1 Methoden zur Initialisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1698.2 Failable Initializers – Wenn es mal schiefgeht . . . . . . . . . . . . . . . . . . 1728.3 Methoden zu Deinitialisierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1748.4 Klassenmethoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1758.5 Methoden kontra Eigenschaften. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
9 Vererbung und Assoziationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1819.1 Das Erbe der Klasse Person . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1819.2 Erweiterungen der abgeleiteten Klasse . . . . . . . . . . . . . . . . . . . . . . . . 1849.3 Methoden überschreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1859.4 Die Initialisierung abgeleiteter Klassen . . . . . . . . . . . . . . . . . . . . . . . . 1879.5 Assoziationen – Beziehungen zwischen Objekten . . . . . . . . . . . . . . . 1919.6 Optional Chaining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1959.7 Der Coalescin Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
10 Protokolle und Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19910.1 Ein eigenes Protokoll entwickeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19910.2 Protokolle statt Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20210.3 Optionale Protokolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20410.4 Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20710.5 Extensions mit Protokollen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
11 Strukturen und Enumerationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21311.1 Zurück zum Spielplatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21311.2 Strukturen oder Klassen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21711.3 String Dependencies – Abhängigkeiten von Zeichenketten . . . . . . . 21911.4 Enumerationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22011.5 Verschachtelte Enumerationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22311.6 Enumerationen mit Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Inhaltsverzeichnis
8
11.7 Enumerationen mit begleitenden Werten . . . . . . . . . . . . . . . . . . . . . . 22611.8 Binärzahlen und OptionSetType-Strukturen . . . . . . . . . . . . . . . . . . . . 228
12 Sicherer Programmcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23512.1 Funktionen absichern mit guard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23512.2 defer-Blöcke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23712.3 Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23912.4 Fehler werfen mit throw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24112.5 Fehler auffangen mit catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
13 Speicherverwaltung mit Referenzzähler . . . . . . . . . . . . . . . . . . . . . . . 24513.1 Automatic Reference Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24713.2 Starke und schwache Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24813.3 Zirkelverweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
14 Robuste Anwendungen und automatisierte Tests . . . . . . . . . . . . . . . 25114.1 Markup-Kommentare im Playground . . . . . . . . . . . . . . . . . . . . . . . . . 25114.2 Kommentare in Projekten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25414.3 Kommentare für die Jumpbar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25714.4 Assertions – Die Behauptungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25814.5 Kompilieren als Debug oder Release . . . . . . . . . . . . . . . . . . . . . . . . . . 26114.6 Präprozessor-Makros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26414.7 Automatisiertes Testen mit Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26614.8 Tests für eigene Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Teil II iOS-Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
15 Lotto – 6 aus 49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27715.1 MVC: Model View Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27715.2 Der iOS-Simulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27915.3 Der Lottozahlengenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28215.4 Der Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28815.5 Inspector und Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28915.6 Arbeiten mit dem Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . 29115.7 Der Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29515.8 Zurück zum Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29815.9 Das war es jetzt schon? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Inhaltsverzeichnis
9
16 Ein Blick hinter die Kulissen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30516.1 Was verbirgt sich hinter IBAction und IBOutlet? . . . . . . . . . . . . . . . . 30516.2 Ein View wird geladen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30716.3 Programmstart einer iOS-Anwendung . . . . . . . . . . . . . . . . . . . . . . . . 30916.4 Instanzen erzeugen mit Lazy Loading . . . . . . . . . . . . . . . . . . . . . . . . . 31416.5 Alles dreht sich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31516.6 Erste Schritte mit Autolayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31716.7 Ein Icon für die App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
17 Eingaben mit virtuellen Tastaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . 32917.1 Einsatz für Autolayout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33117.2 Auftritt für den Assistenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33317.3 Tastaturen ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33817.4 Der First Responder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34117.5 Navigation zwischen Eingabefeldern . . . . . . . . . . . . . . . . . . . . . . . . . . 34317.6 Aus dem View in das Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34517.7 Mitteilungen mit dem UIAlertView . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
18 Schieberegler, Textformatierungen und unendliche Werte . . . . . . . . 35118.1 Der Schieberegler – UISlider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35218.2 Daten-Model: ConsumptionCalculator . . . . . . . . . . . . . . . . . . . . . . . . 35618.3 Methodenaufrufe mit Absender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35918.4 Statische und dynamische Textformatierungen . . . . . . . . . . . . . . . . . 36318.5 Ungültige Werte erkennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
19 Storyboards – Mit dem Drehbuch durch die App . . . . . . . . . . . . . . . . 37119.1 Ein einfaches Storyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37119.2 Segue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37519.3 Der Lebenszyklus einer Szene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37919.4 Storyboards mit Datenübergabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38119.5 Detailansicht und Navigation Controller . . . . . . . . . . . . . . . . . . . . . . . 38719.6 Vorbereitungen für den Übergang . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39119.7 Daten für die View Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
20 Storyboards mit Protokollen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39920.1 Ein Protokoll für den View Controller . . . . . . . . . . . . . . . . . . . . . . . . . 40020.2 Das UIApplicationDelegate-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . 40320.3 Eine Szene für das Jahr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Inhaltsverzeichnis
10
20.4 Verpflichtungen für den View Controller . . . . . . . . . . . . . . . . . . . . . . 40820.5 Kommunikation in alle Richtungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
21 Navigation mit einem Tableisten-Controller . . . . . . . . . . . . . . . . . . . . 41521.1 Der Tableisten-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41621.2 Konfiguration der Schaltflächen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41921.3 Ausflug in die Delegation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42321.4 Ein Delegate für den Tableisten-Controller . . . . . . . . . . . . . . . . . . . . . 42421.5 Delegation – meine Nachrichten an dich. . . . . . . . . . . . . . . . . . . . . . . 427
22 Grafische Oberflächen ohne Interface Builder . . . . . . . . . . . . . . . . . . 43322.1 Kontrolle ist gut – eine Checkliste ist besser! . . . . . . . . . . . . . . . . . . . 43422.2 Steuerelemente erstellen mit Swift-Anweisungen . . . . . . . . . . . . . . . 43822.3 Nachrichten mit Target-Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44422.4 Tags – Etiketten für Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44722.5 Suchen im Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
23 Serialisierung – Aus dem Speicher in eine Datei . . . . . . . . . . . . . . . . 45523.1 Ein Dictionary für das Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45523.2 Objekte sortieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45823.3 Alles nicht ganz so einfach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46023.4 Die Sandbox – Apps im Sandkasten. . . . . . . . . . . . . . . . . . . . . . . . . . . 46323.5 Das NSCoding-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46423.6 Serialisierung – Jetzt wird gespeichert! . . . . . . . . . . . . . . . . . . . . . . . . 46623.7 Die Nachrichtenzentrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
24 Der Picker – ein ganz besonderes Steuerelement . . . . . . . . . . . . . . . . 47724.1 Eine neue Klasse für Farben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47824.2 Das Picker-Steuerelement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48224.3 Protokolle für den Picker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48424.4 Kommunikation mit einem Picker. . . . . . . . . . . . . . . . . . . . . . . . . . . . 48724.5 Eine Farbmischer-App. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48924.6 Picker-Einstellungen auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49224.7 Von Dezimal zu Hexadezimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
25 Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49725.1 Die Showroom-App – der digitale Ausstellungsraum . . . . . . . . . . . . 49825.2 Wohin mit dem Daten-Model? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50125.3 Konfigurationen im Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . 50225.4 Der Tabellen-View-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Inhaltsverzeichnis
11
25.5 Zweite Szene: Die Detailansicht. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51025.6 Ein neuer Segue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51325.7 Vorsicht, Fehlerquelle! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51725.8 Bilder anzeigen mit dem UIImageView . . . . . . . . . . . . . . . . . . . . . . . 518
26 Eye Candy – Unsere App soll schöner werden . . . . . . . . . . . . . . . . . . 52526.1 Angepasste Tabellenzellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52926.2 Ein Controller für die Tabellenzelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 53326.3 Abgerundete Ecken und Rahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53626.4 Settings – die Einstellungen einer App . . . . . . . . . . . . . . . . . . . . . . . . 53926.5 NSUserDefaults – die Benutzereinstellungen . . . . . . . . . . . . . . . . . . 54426.6 Standardeinstellungen erforderlich . . . . . . . . . . . . . . . . . . . . . . . . . . . 54626.7 Kommunikation mit der Nachrichtenzentrale . . . . . . . . . . . . . . . . . . 548
27 Der Collection View. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55327.1 Storyboard mit Collection View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55327.2 Der Collection View Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55727.3 Mit dem Segue zur Detailansicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56327.4 Teilen mit dem UIActivityViewController. . . . . . . . . . . . . . . . . . . . . . 56627.5 Drucken mit AirPrint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57027.6 Unterschiedliche Texte für unterschiedliche Dienste. . . . . . . . . . . . . 572
28 Zeichnen mit Core Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57728.1 Die Klasse UIView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57728.2 Rechtecke zeichnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58128.3 Frame und Bounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58528.4 Farbige Formen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59028.5 Speichern der Context-Einstellungen. . . . . . . . . . . . . . . . . . . . . . . . . . 59328.6 Zeichnen von Farbverläufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59628.7 Arbeiten mit Beschneidungspfaden. . . . . . . . . . . . . . . . . . . . . . . . . . . 59928.8 Kurven und Figuren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
29 Multi-Touch mit Gestenerkennung . . . . . . . . . . . . . . . . . . . . . . . . . . . 60929.1 Linien zeichnen einen Pfeil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60929.2 Einfache Berührungserkennung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61129.3 Wischgesten erkennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61329.4 Objekte bewegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61429.5 Pinch to Zoom – Vergrößern mit zwei Fingern . . . . . . . . . . . . . . . . . 61829.6 Verschiedene Gesten gleichzeitig erkennen . . . . . . . . . . . . . . . . . . . . 62229.7 Objekte drehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Inhaltsverzeichnis
12
29.8 Gesten im Konflikt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62629.9 Die Schüttelgeste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
30 Digitale und analoge Uhren mit Timern . . . . . . . . . . . . . . . . . . . . . . . 63130.1 Die Klasse NSTimer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63130.2 Wie spät ist es? – Datum und Uhrzeit ermitteln . . . . . . . . . . . . . . . . 63530.3 Extensions für die Klasse NSTimer . . . . . . . . . . . . . . . . . . . . . . . . . . . 63630.4 Eine analoge Uhr mit Core Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . 64130.5 Ein Zifferblatt zeichnen mit Winkelfunktionen . . . . . . . . . . . . . . . . . 64530.6 Timer im Einsatz – die Uhr tickt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
31 Lokale Benachrichtigungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65131.1 Lokale Benachrichtigungen mit UILocalNotification . . . . . . . . . . . . . 65231.2 Eingehende Nachrichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65631.3 Benachrichtigungen anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65931.4 Push-Benachrichtigungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
32 Karten und Koordinaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66332.1 Der Location-Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66432.2 Auswerten von Positionsinformationen. . . . . . . . . . . . . . . . . . . . . . . . 66632.3 Geocoding – Wo bin ich hier?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66932.4 Karten mit dem MKMapView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67232.5 Annotations – Anmerkungen auf der Karte . . . . . . . . . . . . . . . . . . . . 67832.6 Benutzerdefinierte Anmerkungen gestalten und anzeigen . . . . . . . . 681
33 Daten suchen und finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68533.1 Zugriff mit Key Value Coding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68533.2 Schlüsselpfade und Aggregatfunktionen . . . . . . . . . . . . . . . . . . . . . . . 68833.3 Listen filtern mit NSPredicate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69233.4 Erweiterte Vergleiche, logische Operatoren und Closures . . . . . . . . . 69533.5 Prädikate mit regulären Ausdrücken . . . . . . . . . . . . . . . . . . . . . . . . . . 69733.6 Daten filtern für Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69833.7 Listen für den Tabellen-View-Controller . . . . . . . . . . . . . . . . . . . . . . . 70333.8 Suchen mit dem UISearchController. . . . . . . . . . . . . . . . . . . . . . . . . . 706
Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
31
Kapitel 1
Datentypen und Optionals
Im grundlegenden Umgang mit Variablen und Werten sind sich die meistenmodernen Programmiersprachen sehr ähnlich und unterscheiden sich oft nur inder verwendeten Syntax. Swift ist dabei keine Ausnahme, und wenn Sie schon mitanderen Sprachen gearbeitet haben, wird Ihnen der Inhalt der nächsten Seitenbestimmt vertraut vorkommen. Trotzdem sollten Sie dieses Kapitel nicht über-springen, denn Swift bietet einige Besonderheiten und Anweisungen, die man inanderen Sprachen nicht findet. Selbst bei einfachen und alltäglichen Dingen, wiezum Beispiel der Addition von Variablen, können erfahrene Entwickler durchSwift noch überrascht werden. Lassen auch Sie sich also überraschen!
1.1 Willkommen auf dem Spielplatz
Xcode bietet in der aktuellen Version einen besonderen Dokumententyp, der als»Playground«, englisch für Spielplatz, bezeichnet wird. Wenn Sie in einem Play-ground Programmcode schreiben, wird Ihnen das Ergebnis Ihrer Arbeit oft sofortin einer Seitenleiste neben dem Texteditor angezeigt, die von Apple als Results Side-bar bzw. als Ausgabebereich bezeichnet wird. Dort können Sie leicht überprüfen,ob die eingegebenen Anweisungen korrekt sind und das gewünschte Ergebnis lie-fern. Der Spielplatz eignet sich hervorragend, um neue Dinge auszuprobieren undzu testen, oder sich – wie in unserem Fall – mit Swift vertraut zu machen.
Einen neuen Playground können Sie direkt vom Welcome-to-Xcode-Fenster auserstellen, das beim Start der Entwicklungsumgebung angezeigt wird. Wählen Siedort GET STARTED WITH A PLAYGROUND. Möchten Sie zu einem bereits bestehen-den Projekt einen Playground hinzufügen, führt der Weg über die MenüpunkteFILE, NEW und FILE...
Ein Playground der Plattform iOS unterscheidet sich von einem OS-X-Spielplatznur durch die Anweisung, mit der das zugehörige Framework für die grafischenOberflächen importiert wird. iOS-Apps arbeiten mit UIKit, während für OS X dasCocoa Framework importiert wird. Für unsere ersten Schritte benötigen wirjedoch nur das Foundation Framework und somit ist es egal, für welche PlattformSie den Playground erzeugen. Foundation ist sowohl in UIKit als auch in Cocoaenthalten. Nennen Sie Ihren ersten Playground Datentypen und speichern Sie dieDatei an einem Ort, an dem Sie sie später leicht wiederfinden. Sie sollten immer
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
32
bemüht sein, Ihre Projekte gut zu organisieren, um die Übersicht nicht zu verlie-ren und Dinge schnell finden zu können.
Nachdem Xcode den Playground angelegt hat, öffnet die Entwicklungsumgebungein in zwei Bereiche geteiltes Fenster. Die linke Seite ist der Editor, in den wirunsere Anweisungen schreiben können. Die rechte Seite wird als Ausgabebereichbezeichnet und dient zur Ausgabe von Werten und Variablen. Neben der import-
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.2Variablen und Konstanten
33
Anweisung und einem Kommentar gibt es im Programm sogar schon einenBefehl. Mit
wird der Variablen str der Text Hello, playground zugewiesen, der daraufhin imAusgabebereich angezeigt wird. Da wir uns mit Texten erst später beschäftigen,können Sie die Anweisung entfernen. Löschen Sie aber nicht versehentlich denimport-Befehl. Ohne ein geladenes Framework kann es in einem Swift-Pro-gramm zu verwirrenden Fehlermeldungen kommen, deren wahre Ursache nurschwer zu erkennen ist.
1.2 Variablen und Konstanten
Lassen Sie uns bei der Reise in die Welt der Swift-Programmierung mit etwasganz Einfachem beginnen. Wie alle modernen Programmiersprachen bietet Swiftdie Möglichkeit, im Programmcode Variablen zu deklarieren und ihnen Wertezuzuweisen. Der von Xcode vorbereitete Playground hat das mit seiner Anwei-sung schon gut demonstriert. Für verschiedene Anwendungsfälle kommen dabeidann unterschiedliche Datentypen zum Einsatz. Soll mit den Werten gerechnetwerden, fällt die Wahl in der Regel auf die Typen Int, Double oder Float, je nachder erforderlichen Genauigkeit. Das nachfolgende kurze Listing zeigt beispielhaftdie Definition zweier Variablen mit dem Befehl var und zwei unterschiedlichenDatentypen. Wenn Sie alle Anweisungen richtig eingegeben haben, wird Xcode imAusgabebereich des Playground-Fensters die Inhalte der Variablen anzeigen. Andieser Stelle erneut der Hinweis, dass die Anweisungen auch funktionieren, wennSie die Befehlszeilen aus Gewohnheit mit einem Semikolon abschließen.
var str = "Hello, playground"
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
34
Um welche Typen es sich bei den Variablen in unserem Code handelt, können Sievermutlich auch ohne jahrelange Erfahrung in der Softwareentwicklung und ohnedie explizite Angabe des Typs schnell selbst erkennen. Die Variable age ist eineganze Zahl, ein sogenannter Integer. Bei taxRate finden wir Nachkommastellen,sodass es sich um eine Dezimalzahl handeln muss. Dort sollte dann der TypDouble oder Float verwendet werden, denn als ganze Zahl ließe sich dieser Wertnur unvollständig ablegen.
Wie Sie sicher bestätigen können, geben die Werte selbst schon genau vor, welcherDatentyp verwendet werden muss, und so ist es in Swift oftmals gar nicht notwen-dig, den Typ einer Variablen bei der Definition explizit anzugeben. Der Compilerkann den Typ selbst erkennen. Die Definitionen der beiden Variablen würden inSwift daher auch so funktionieren:
var age:Int = 43
var taxRate:Double = 9.5
Wichtig
Für Variablennamen wird in Swift die Lower-Camel-Case-Schreibweise verwen-det. Der erste Buchstabe im Namen ist ein kleiner Buchstabe, alle weiteren Wör-ter, aus denen der Name gebildet wird, beginnen mit einem Großbuchstaben.Beispiele für aussagekräftige Namen wären arrayOfSelectedItems oderfirstDayInMonth. Unterstriche in Bezeichnern sind in Swift nicht üblich.
var age = 43
var taxRate = 9.5
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.2Variablen und Konstanten
35
Diese automatische Typerkennung des Compilers, die in der englischen Doku-mentation als »Type Inference« bezeichnet wird, funktioniert in Swift sehr gut,sodass bei den meisten Variablen auf eine explizite Angabe des Datentyps verzich-tet wird. Als Entwickler kann man jedoch sicher sein, dass der Compiler den rich-tigen Typ auswählt. Außerdem wird der Programmcode so kürzer und besserlesbar, worauf man bei Apple sehr viel Wert legt.
Für das Programm selbst ändert sich dabei jedoch nichts. Die Variable age ist wei-terhin eine ganze Zahl und für Dezimalbrüche wie taxRate wählt der Compilerimmer den Typ Double, weil dieser im Vergleich zu Float über eine größereGenauigkeit verfügt. Bei beiden Variablen wird der Typ aus den zuerst zugewiese-nen Werten ermittelt. Spätere Änderungen auf einen anderen Typ sind nicht mög-lich. Wurde eine Variable als Int festgelegt, können Sie ihr anschließend keineZeichenkette zuweisen. Das folgende Beispiel wird nicht funktionieren, wie Siein Ihrem Playground leicht ausprobieren können. Durch Anklicken des Fehler-symbols links neben dem Programmcode können Sie die Fehlermeldung ein- oderausblenden.
Die Deklaration und Definition einer Variablen muss in Swift keineswegs immerin einer Programmzeile geschehen, die Anweisungen können auf mehrere Zeilenverteilt werden. Jetzt ist der Compiler jedoch nicht mehr in der Lage, den Typ derVariablen selbstständig zu erkennen, und benötigt unsere Hilfe. Der Typ muss beider Deklaration wieder explizit angegeben werden.
var age = 43
var taxRate = 9.5
age = "19"
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
36
Wie groß der Wert einer Variablen sein kann, hängt teilweise von der Systemarchi-tektur ab, auf der das Programm ausgeführt wird. Auf einem 32-Bit-System wirdfür den Typ Int ein 32 Bit langes Datenwort verwendet, das den möglichen Wertauf einen Bereich von -2.147.483.648 bis 2.147.483.647 eingrenzt. Auf Systemenmit einer 64-Bit-Architektur ist Int ein 64 Bit langes Datenwort und kann Wertezwischen -9.223.372.036.854.775.808 und 9.223.372.036.854.775.807 annehmen.Werden explizit kleinere oder größere Datenworte benötigt, können statt Int dieDatentypen Int8, Int16, Int32 und Int64 verwendet werden. Der Typ Float istauf jedem System ein 32-Bit-Datenwort, Double hingegen immer 64 Bit lang. Wel-che Werte auf Ihrem System möglich sind, können Sie mit den folgenden vierAufrufen der print-Funktion herausfinden.
Ein Aufruf der Funktion print in einem Playground führt zu einer Ausgabe in derResults Sidebar. Dort wird der Wert direkt neben der zugehörigen Anweisungangezeigt. Der Ausgabebereich ist jedoch nicht der einzige Ort, an dem die Ent-wicklungsumgebung die Ausgaben von print anzeigt, zusätzlich werden sie indie Konsolenansicht geschrieben. Diese ist in der Standardkonfiguration einesPlaygrounds allerdings immer unsichtbar und muss erst eingeblendet werden.Die Schaltfläche HIDE OR SHOW THE DEBUG AREA aus der Symbolleiste erledigtdas. In der Konsole stehen die minimalen und maximalen Werte nicht neben den
var age:Int
var taxRate:Double
age = 43
taxRate = 9.5
// Der größe Int-Wert
print(Int.max)
// Der kleinste Int-Wert
print(Int.min)
// Der größte Double-Wert
print(DBL_MAX)
// Der kleinste Double-Wert
print(DBL_MIN)
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.2Variablen und Konstanten
37
Anweisungen, sondern erscheinen in der Reihenfolge, in der sie mit print ausge-geben wurden.
In Xcode-Projekten für iOS-Apps oder OS-X-Anwendungen steht Ihnen währendder Entwicklung kein Ausgabebereich zur Verfügung, und Ihre Anweisungen wer-den dort auch nicht automatisch sofort nach der Eingabe ausgeführt. Das funk-tioniert nur im Playground. Die Konsolenansicht gibt es jedoch auch dort undkann für Ausgaben genutzt werden. Zögern Sie nicht, print zu verwenden, umden Programmablauf Ihrer Anwendungen nachzuvollziehen oder Werte anzuzei-gen. Ein Aufruf von print verrät Ihnen nicht selten schneller etwas über Ihr Pro-gramm als die Analysewerkzeuge der Entwicklungsumgebung.
Wenn Sie den Mauspfeil auf einen Wert im Ausgabebereich bewegen, werden dortdie Schaltflächen für Inline Results und Quick Look sichtbar. Beide Funktionen bie-ten weitere Möglichkeiten, den Wert einer Variablen im Playground auszugeben.Aktivieren Sie ein Inline Result, wird der Wert direkt im Codeeditor eingeblendet.Quick Look zeigt den Wert in einem kleinen Fenster, das jedoch sofort wieder ver-schwindet, sobald ein beliebiger anderer Punkt auf dem Bildschirm angeklicktwird. Die Ausgabe eines Inline Results bleibt sichtbar, bis sie wieder deaktiviertwird.
Während Variablen zur Laufzeit eines Programms jederzeit neue Werte, allerdingsnur desselben Typs, zugewiesen werden können, ist dies bei Konstanten nichtmöglich. Konstanten werden in Softwareprojekten daher oft zur Konfigurationeingesetzt, um Werte einer Anwendung leichter zu verwalten und »magische Zah-len« zu vermeiden. Dabei handelt es sich um Zahlenwerte, die direkt im Pro-grammcode stehen und deren Aufgaben oft nur schwer erkennbar sind. EineKonstante mit einem aussagekräftigen Namen kann dann sehr zur Lesbarkeit desCodes betragen.
In Swift werden Konstanten über den Befehl let erzeugt. Das nachfolgende Lis-ting zeigt die Definition der Zahl Pi sowie einer Serveradresse als Zeichenkette.
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
38
In den ersten Versionen von Swift war es bei einer Konstanten nicht möglich,Deklaration und Definition auf mehrere Programmzeilen zu verteilen, das funk-tionierte selbst dann nicht, wenn der Typ explizit angegeben wurde. Seit Swift 2.0können Deklaration und Definition getrennt werden, in vielen anderen Program-miersprachen funktioniert das bei Konstanten nicht.
Eine nachträgliche Änderung des zugewiesenen Wertes ist anschließend nichtmehr möglich. Eine Konstante ist unveränderlich, und der Compiler wird bei demVersuch, Änderungen vorzunehmen, Fehlermeldungen ausgeben.
1.3 Zahlendatentypen konvertieren
Nicht selten gibt es in Programmen Situationen, bei denen die Inhalte von mehre-ren Variablen zu einem Wert zusammengefasst werden müssen. Ein sehr gutesBeispiel sind mathematische Berechnungen, die aus einzelnen Werten ein Ergeb-nis ermitteln. Swift unterscheidet sich dabei nicht von anderen Programmierspra-chen und unterstützt eine Vielzahl von Rechenoperatoren. Wie nicht anders zuerwarten, gilt immer Punkt- vor Strichrechnung.
let pi = 3.14159265359
let server = "http://cocoa-coding.de"
let pi:Double
pi = 3.14159265359
let server:String
server = "http://cocoa-coding.de"
Wichtig
Swift und Xcode erlauben bei der Entwicklung die Verwendung sämtlicher Uni-code-Zeichen als Variablennamen. So können Sie beispielsweise statt des Varia-blennamens pi auch das Zeichen U+30C0 (Greek Small Letter Pi) verwenden.Inwieweit dies die Programmierung leichter und übersichtlicher macht, solltenSie für sich selbst entscheiden. Empfehlen kann man diese Vorgehensweise ver-mutlich nur in Ausnahmefällen.
let π = 3.14159265359
var a = 75
var b = 100
var c = 5
let sum1 = a + b * c
let sum2 = (a + b) * c
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.3Zahlendatentypen konvertieren
39
Beachtenswert im gezeigten Beispiel ist der Umstand, dass auch das Ergebniseiner Berechnung einer Konstanten zugewiesen werden kann. Im Unterschied zueinigen anderen Programmiersprachen muss der Wert einer Konstanten in Swiftnicht zwangsläufig während der Kompilierung bekannt sein, obwohl er sich in die-sem Beispiel durchaus ermitteln ließe. Sogar eine Textfeldeingabe, die erst nachdem Start der Anwendung vorgenommen wird, kann in Swift einer Konstantenzugewiesen werden.
Solange wir uns bei den Rechenoperationen auf nur einen Datentyp beschränken,können wir ohne Probleme programmieren. Schwierig wird es erst, wenn unter-schiedlichen Typen verwendet werden. Dann kann schon eine einfache Additionzu Problemen führen:
Auch ohne Angabe eines Typs können wir die Variable a als ganze Zahl und somitvom Typ Int identifizieren. Bei b hingegen handelt es sich um eine Dezimalzahl,für die der Swift-Compiler dann einen Double-Typ verwendet, sofern ihr Typ nichtexplizit als Float angegeben wird. Doch welchen Typ muss man einsetzen, wenndie beiden Variablen addiert werden sollen? Mit einem weiteren Double wäresichergestellt, dass der Nachkommateil der Summe nicht verloren geht, aber inmanchen Situationen ist vielleicht genau das gewünscht und man möchte nurganze Zahlen. Weil der Swift-Compiler diese Entscheidung nicht eigenständigtreffen kann, führt die Addition zu einem Fehler. Schuld daran sind die unter-schiedlichen Datentypen. Leider ist die Meldung der Entwicklungsumgebungnicht besonders aussagekräftig, wenn man mit der Problematik nicht vertraut ist:
In der Softwareentwicklung unterscheidet man zwei Arten der Typkonvertierung.Bei der impliziten Konvertierung entscheidet der Compiler selbstständig, welcherTyp verwendet werden soll. Bei einer Berechnung, die sowohl Int als auchDouble-Typen verwendet, würde vermutlich ein Double für das Ergebnis verwen-det, um eine bestmögliche Genauigkeit zu gewährleisten. Allerdings gibt es keineRegel, dass dies so sein muss, und Programmiersprachen mit anderen Compilernkönnen sich anders verhalten. Damit der Entwickler sich nicht auf Vermutungen
var a = 75
var b = 3.8
// Die Addition unterschiedlicher Datentypen
// führt zu einer Fehlermeldung!
let sum = a + b
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
40
verlassen muss, ist in Swift eine implizite Konvertierung nicht möglich. Diegezeigte Fehlermeldung ist die Folge.
Bei einer expliziten Konvertierung muss der gewünschte Typ im Programm genaufestgelegt werden, was somit zu einer Aufgabe für uns Programmierer wird. Solldas Ergebnis vom Typ Double sein, müssen wir den Compiler anweisen, die Vari-able a vor der Addition mithilfe einer Funktion in einen Double-Typ zu konvertie-ren. Sind beide Summanden vom gleichen Typ, ergibt sich der Typ für die Summe.
Wollen wir unser Ergebnis lieber als ganze Zahl, muss die Variable b konvertiertwerden. Doch Vorsicht, gerundet wird die Zahl von der Int-Funktion nicht! DieNachkommastellen werden abgeschnitten, aus 3,8 wird 3 und die Summe derAddition somit 78! Mit einer expliziten Konvertierung erhalten wir immer dengewünschten Typ und sind nicht von der Entscheidung eines Compilers abhängig.
Die gezeigten Arten der Konvertierung entsprechen einer Umwandlung, die als»cast« oder »typecasting« bezeichnet wird, in Swift allerdings mit einer etwasungewöhnlichen Syntax. Viele andere Programmiersprachen verwenden eineSchreibweise, bei der dem zu konvertierenden Wert der gewünschte Typ in run-den Klammern vorangestellt wird. Dort sieht es so aus:
Möchte man in einem Swift-Programm zwei Int-Werte addieren, das Ergebnisaber als Double erhalten, ist das ebenfalls nur ein kleines Problem. In den rundenKlammern der Funktionen kann die Addition programmiert werden. So ist esnicht erforderlich, beide ganze Zahlen einzeln zu konvertieren.
// Die Double-Funktion:
// a wird zunächst in einen Double-Typ umgewandelt
// c wird so zu einem Double-Typ
var sumDouble = Double(a) + b
// Die Int-Funktion:
// b wird zunächst in einen Int-Typ umgewandelt
// c wird so zu einem Int-Typ
var sumInt = a + Int(b)
// Typecasting, wie es in anderen Sprachen
// angewendet wird.
// var sum = (Double)a + b
var x = 100
var y = 60
// Einzelne Konvertierung, nicht erforderlich
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.4Werte runden
41
1.4 Werte runden
Bei einer expliziten Konvertierung von Double zu Int sämtliche Nachkommastel-len abzuschneiden, kann gewünscht sein, doch nicht weniger oft möchte man denWert zuvor runden. Diese Aufgabe kann die Funktion round übernehmen. Wie Siemit den folgenden Anweisungen selbst ausprobieren können, wird ab einemNachkommawert von .5 aufgerundet, ansonsten wird abgerundet.
Soll der gerundete Wert dann zu einem Int-Typ werden, spricht nichts dagegen,verschiedene Anweisungen zu verschachteln. So kann man im Code eine Zeileeinsparen, ohne dabei allzu viel Lesbarkeit einzubüßen.
Zwei weitere wichtige Funktionen zur Manipulation von Double-Werten sindfloor und ceil. Sie liefern den nächstniedrigeren und nächsthöheren ganzzahli-gen Wert, vollkommen unabhängig vom Wert hinter dem Komma. Das Ergebnisist weiterhin ein Double.
// var sum = Double(x) + Double(y)
// Konvertierung der Summe
var sum = Double(x + y)
var a1 = 99.49
var r1 = round(a1)
// r1 ist jetzt 99.0
var a2 = 99.50
var r2 = round(a2)
// r2 ist jetzt 100.0
var a2 = 99.50
var r2 = Int(round(a2))
// r2 ist jetzt 100 und vom Typ Int
var aValue = 99.001
var c = ceil(aValue)
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
42
Einige Entwickler, die ich kennengelernt habe, hatten Schwierigkeiten, sich dieFunktionsweisen von floor und ceil zu merken und diese zu unterscheiden.Denken Sie dabei an die englischen Begriffe. floor ist der Fußboden und somitder niedrige, untere Wert. ceil ist eine Abkürzung für ceiling, die Zimmerdecke.Bei dieser Funktion bekommen wir den höheren, oberen Wert. Die Zimmerdeckeist oben und der Fußboden ist unten. Ganz einfach!
1.5 Minimum und Maximum
Wird der kleinere oder der größere Wert zweier Zahlen benötigt, kann man diesmit einer if-Struktur sicherlich leicht programmieren. Etwas eleganter sind die inSwift bereits vorhandenen Funktionen max und min.
Eine besondere Erklärung ist an dieser Stelle vermutlich nicht nötig. Erwähnens-wert ist jedoch, dass die beiden Funktionen in Swift auch mehr als zwei Werte ver-arbeiten können. Bei den ähnlichen Funktionen anderer Programmiersprachenist das nicht möglich. Allerdings müssen sämtliche Werte vom gleichen Typ sein,also ausschließlich Double, Float oder Int.
// c ist jetzt 100.0
var f = floor(aValue)
// f ist jetzt 99.0
var m1 = 1234
var m2 = 9876
// Den größeren und den kleineren Wert zweier
// Int-Typen ermitteln
var maximum = max(m1,m2)
var minimum = min(m1,m2)
var m1 = 12.34
var m2 = 98.76
var m3 = 87.88
var m4 = 666.6
// Den größten und den kleinsten Wert aus vier
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.6Der Datentyp Bool
43
Eine Alternative zu min und max bieten die beiden Funktionen minElements undmaxElements, die jedoch beide eine Auflistung des Typs Array als Parametererwarten. Mit diesen Listen werden wir uns in Kapitel 3 noch genauer beschäfti-gen. Um die Funktionen auf unsere vier Variablen anzuwenden, genügt es für denAugenblick, die Bezeichner zusätzlich in eckige Klammern einzufassen. Sämtli-che Funktionen akzeptieren neben Variablen und Konstanten auch feste Werte,die unveränderlich im Programmcode stehen.
1.6 Der Datentyp Bool
Einen Datentyp, den man in diesem Kapitel nicht unterschlagen sollte, ist der TypBool, benannt nach dem englischen Mathematiker George Boole. Eine Variableoder Konstante des Typs Bool kann ausschließlich die Werte true oder falseannehmen und wird deshalb fast ausnahmslos dazu verwendet, um einebestimmte Aussage als wahr oder unwahr zu kennzeichnen. Wenn wir uns inKapitel 4 mit Fallunterscheidungen beschäftigen, wird der Typ Bool daher einegroße Rolle spielen.
In einigen anderen Programmiersprachen kann ein Bool alternativ durch Zahlen-werte gesetzt werden, wobei 0 einem false und jeder andere Wert einem true
// Double-Typen ermitteln
var maximum = max(m1,m2,m3,m4)
var minimum = min(m1,m2,m3,m4)
var minValue = minElement([m1, m2, m3, m4])
var maxValue = maxElement([4.5, 4.0, 3.9, 4.4])
// Zuweisungen boolescher Typen
// mit Angabe des Datentyps
var valueB1:Bool = true
// Ohne Angabe des Datentyps
var valueB2 = false
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
44
entspricht. Weil so die Lesbarkeit des Codes aber sehr beeinträchtigt wird, gibt esdiese Möglichkeit in Swift 2.0 nicht mehr. Die aus Objective-C bekannten WerteYES und NO funktionieren in Swift ebenfalls nicht.
1.7 Optionals
Einer der größten Unterschiede zwischen Objective-C und Swift ist die Möglich-keit, Variablen und Konstanten im Programmcode als Optional zu deklarierenund ihnen damit die Fähigkeit zu geben, alternativ zu einem Wert den Zustandnil anzunehmen. Ein Optional ist nil, wenn ihm noch kein Wert zugewiesenwurde oder sein Zustand explizit unbestimmt sein soll.
Haben Sie das alles sofort verstanden? Zugegeben, das klingt sehr technisch, aberso ist die Softwareentwicklung gelegentlich. Möchte man Optionals an einem Bei-spiel aus dem Alltag erklären, muss man dafür ein wenig ausholen:
Stellen Sie sich ein digitales Thermometer vor, dessen gemessene Temperatur voneiner Software verwaltet und angezeigt werden soll. Im Sommer erreicht das Ther-mometer Temperaturen von über 30 Grad, im Winter hingegen Werte unter 0Grad. So ergibt sich ein großer Bereich von möglichen Temperaturen, wobei essich immer um Dezimalzahlen handelt. In der Software scheint der DatentypDouble daher bestens geeignet, die ermittelte Temperatur aufzunehmen und zurAnzeige zu bringen. Wie Sie inzwischen wissen, müssen Variablen und Konstan-ten aber mit einem Wert initialisiert werden, bevor man das erste Mal lesend aufsie zugreifen kann. Es gibt Situationen, in denen eben dies zu einem Problemwird.
Solange das Thermometer funktioniert, hat das Programm mit der Temperaturund dem Typ Double keine Schwierigkeiten. Problematisch wird es erst, wenn dasThermometer ausfällt oder von der Software aus einem anderen Grund keineDaten mehr empfangen werden können. Mit welcher Temperatur haben wir esdann zu tun und welcher Wert soll dann angezeigt werden?
Eine Möglichkeit wäre es, die Variablen mit dem Wert 0 zu initialisieren undsomit eine Temperatur von 0 Grad anzuzeigen, wenn keine Messungen vorliegen,aber das ist keine gute Lösung. 0 Grad ist eine der möglichen Temperaturen inunserem Bereich, und wenn im Programm mit diesem Wert gearbeitet wird, sollteman davon ausgehen können, dass die Temperatur so gemessen wurde. Die Soft-ware benötigt zusätzliche Informationen darüber, ob ein gemessener Wert vor-
// Alternative Zuweisung von Zahlen
// Funktioniert in Swift 2.0 nicht mehr
var value1:Bool = 1
var value2:Bool = 0
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.7Optionals
45
liegt, aber ein Zahlenwert des Typs Double kann darüber keine Auskunft geben.Das Programm muss erweitert werden. Ob es sich bei dem abgelegten Wert tat-sächlich um eine gemessene Temperatur handelt, ließe sich mit einer zusätzli-chen booleschen Variablen abbilden. Oder Sie verwenden einen Optional!
In Swift kann jeder Typ zu einem Optional werden, allerdings ist es bei der Defini-tion einer Variablen oder Konstanten erforderlich, diese Erweiterung explizit anzu-geben, denn dass eine Variable oder Konstante ein Optional sein soll, kann derCompiler nicht eigenständig erkennen. Er würde immer einen regulären Typ ein-setzen und sich dann beschweren, wenn er für den Wert keine Zuweisung findet.Um aus einem regulären Typ einen Optional zu machen, wird dem Datentyp einFragezeichen angehängt. So erfährt der Compiler, dass dieser Wert nil sein darf.
Wenn Sie die zwei Anweisungen aus dem nächsten Listing in Ihrem Playgroundeingeben, wird Ihnen Xcode für die Variable temperatur1 den Wert 32.5 im Aus-gabebereich ausgeben. Für temperatur2 erhielten Sie in der Vergangenheit dieAusgabe { Some 32.5}, wobei Some ein Hinweis auf einen Optional war. In dermomentan aktuellen Xcode-Version wird das Some leider nicht mehr angezeigt.
Eindeutig werden die Informationen der Entwicklungsumgebung, wenn Sie diebeiden Variablen mit der print-Funktion ausgeben. Zusätzlich zum Wert fürtemperatur2 wird jetzt das Wort Optional angezeigt.
// Definition einer Variablen
var temperatur1:Double = 32.5
// Definition einer Variablen als Optional
var temperatur2:Double? = 32.5
...
// Ausgabe der beiden Variablen
print(temperatur1)
print(temperatur2)
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
46
Besonders interessant verhält sich der Playground, wenn Sie für die beiden Varia-blen die Zuweisungen der Werte entfernen. Die Variable temperatur2 ist einOptional und kann legitim ohne Wert verwendet werden. Ihr Zustand ist dannautomatisch nil und genau das wird im Ausgabebereich angezeigt, sobald mandie Zuweisung entfernt.
Löscht man die Zuweisung für die Variable temperatur1, kommt es sofort zueiner Fehlermeldung. Eine reguläre Variable muss vor der ersten Verwendung miteinem Wert initialisiert werden, sonst kann sie nicht ausgegeben werden.
In Objective-C bekam man es mit nil zu tun, wenn ein Speicherzeiger auf keingültiges Objekt verwies, und das war nicht immer ein gewünschter Zustand. InSwift ist nil bei einem Optional hingegen ein legitimer Wert. Er sagt aus, dass esfür die Variable keinen Wert gibt. Um dies zu ermöglichen, muss der Typ aberexplizit als Optional gekennzeichnet werden. So kann der Entwickler bestimmen,welche Variablen und Konstanten nil sein dürfen und welche nicht.
1.8 Programmieren mit Optionals
Den Programmcode, wie er in der Software unseres digitalen Thermometers zumEinsatz kommen könnte, zeigt das folgende Beispiel. Ist die Variable temp gleichnil, wird der Text Keine Messung ausgegeben, gibt es hingegen einen Wert, fin-den wir stattdessen die Temperatur im Ausgabebereich. Probieren Sie das in IhrerEntwicklungsumgebung aus.
// Definition einer Variablen
var temperatur1:Double = 32.5
// Definition einer Variablen als Optional
var temperatur2:Double?
// Ausgabe der beiden Variablen
print(temperatur1)
print(temperatur2)
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
1.8Programmieren mit Optionals
47
Vereinfacht beschrieben, hat man es bei einem Optional immer mit zwei Wertenzu tun. Wird eine Variable oder Konstante mit ihrem Namen angesprochen, kannman ausschließlich Informationen darüber erhalten, ob der Optional nil ist odernicht. Ist der Zustand nicht nil, muss zunächst ein »Auspacken« stattfinden(Unwrapping in der englischen Dokumentation), um an den eigentlichen Wert zugelangen. Das geschieht, indem man dem Bezeichner ein Ausrufezeichen anhängt,wie es im Listing mit temperatur! geschehen ist.
Jetzt wird aus einem Optional-Double ein regulärer Double-Typ und in der Ent-wicklungsumgebung wird der Zahlenwert ohne den Zusatz Optional angezeigt.Auspacken sollte man einen Optional aber nur, wenn zuvor sichergestellt wurde,dass die Variable nicht nil ist, ansonsten führt der Versuch direkt zu einem Feh-ler. Vergleiche mit der if-Struktur werden wir uns in den folgenden Kapitelngenauer ansehen.
Ein anderer Weg, einen Optional auf nil zu testen und auszupacken, funktioniertüber ein Verfahren, das in Swift als Optional Binding bezeichnet wird. Dabei wirdder Optional in der if-Struktur einer neuen Konstanten oder Variablen zugewie-sen. Ist die Zuweisung erfolgreich, ist der Wert also nicht nil, erhält man denWert automatisch in einer regulären Variablen, die aber nur innerhalb der if-Struktur verwendet werden kann.
var temperatur:Double? = 18.2
if temperatur == nil
{
print("Keine Messung")
}
else
{
print(temperatur!)
}
var temperatur:Double? = 18.2
if let temp = temperatur
{
print(temp)
}
else
{
print("Keine Messung")
}
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Kapitel 1Datentypen und Optionals
48
Für Umsteiger ist das Optional Binding vielleicht etwas gewöhnungsbedürftig, eslohnt sich aber sehr, diese Schreibweise zu verwenden, da sie zu kurzem undübersichtlichem Code führt. Optionale Typen kommen in Swift bei vielen Klassenund Strukturen zum Einsatz, sodass wir uns später noch mal mit diesem Themabeschäftigen werden.
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
715
Stichwortverzeichnis
Symbole#define 306
AActivity Item 567Adresse
ermitteln 669advancedBy 64Aggregatfunktion 692AirPrint 570Alias 121Analoge Uhr
mit Zeigern 641Animierter Übergang 428Annotation 678Anonymer Typ 112AnyObject 70, 76, 202, 297, 359, 637Application Kit 24Argumente 103Array 67as-Anweisung 392Assertion 260Assistant Editor 354Assistent 333Associated Values 227Assoziation 191Ausgabebereich 32Ausrichtung
verhindern 565Autolayout 317, 331Automatic Reference Counting 174, 247
BBadge 659Bar Button Item 396, 405Benachrichtigung 652Benannter Parameter 104, 107Beobachter-Entwurfsmuster 475Berechnete Eigenschaft 157Berührungserkennung 611Beschneidungspfad 599Bézierkurve 603Bilddatei
hinzufügen 521
Binärzahl 230Bit 230Bitmuster 230Bool 43Boolescher Operator 83, 84break 87, 95Bundle 657Button 291
Ccatch 242ceil 41CGColor 582CGFloat 495, 560CGPoint 439CGRect 439CGRectMake 439, 579, 583, 644CGSize 439characters 52Checkbox 440CLGeocoder 669Clipping Path 599CLLocationManager 664Closed Range 89Closure 71, 126, 459, 637, 669, 696Coalescing Operator 198Cocoa Framework 24Cocoa Touch Framework 26Collection View 553Combobox 478compare 53Completion Handler 128Constraints 317
aktualisieren 390automatisch anpassen 321
continue 96Controller 295Convenience Initializer 191, 214, 479, 493Core Graphics 577, 642Core Location 663count 52, 69
DDateinamen
anhängen 467
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Stichwortverzeichnis
716
Datumermitteln 635
Debugger-Ansicht 88Debug-Version 261default 87deinit 174, 380, 634Delegate 403, 423Delegation 423Designated Initializer 172, 189, 192, 380, 479Dezimaltrennzeichen 363Dictionary 73, 284, 456, 660dispatch_after 139dispatch_async 141distanceTo 62Double Tap 626dropFirst 66dropLast 66Drucken 571
EEigenschaft 156
berechnete 157Eingabefeld 329Ellipse 592Ellipsis Operator 115else if 82E-Mail 567Emoji 63Enumeration 220Erinnerung 652Error-Handling 239ErrorType 241Explizite Konvertierung 40Extension 207, 637External Parameter Name 108
FFacebook 567Factory-Methode 176Failable Initializer 172, 195fallthrough 86Farben 482Farbmischer 489Farbverlauf 596Fast Enumeration 91filter 73Filtern 692first 65First Responder 341floor 41fmin 643for-in-Schleife 89, 91format 51Format Specifier 51, 360, 494, 635
for-Schleife 88, 286, 645, 702Forward Geocoding 670Foundation Framework 25, 31, 153Frame 439Funktion 103
GGeocoding 669Gestenerkennung 609Getter 158, 177GPS-Sensor 665Grafik
für Retina-Display 421Grand Central Dispatch 138Groß- und Kleinschreibung 53, 71, 80guard-Struktur 235Gültigkeitsbereich 99
HHalf-Open Range 89hasPrefix 80hasSuffix 79Human Interface Guidelines 293
IIBAction 295, 305
erstellen 336IBOutlet 295, 305
erstellen 335Icon 324if-Struktur 79Implizite Konvertierung 39Indexpositionen 113indices 62Info.plist 663, 708init 170Inline Closure 135Inline Result 37, 97, 104, 105inout 120Inspector 289Instanziierung 155Instanzvariable 156Interface Builder 288internal 155iOS-Simulator 280
Ausrichtung 316Home-Button 281Koordinaten eingeben 668
isEmpty 52, 157isKindOfClass 614Iteration 91
JJumpbar 257, 336, 533
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Stichwortverzeichnis
717
KKapselung 169, 404, 501, 685Karte 663
Callout 682eigenen Ort anzeigen 672Maßstab 676Stecknadel 681
kCFBundleNameKey 657Key Path 688Key Value Coding 685, 686Key Value Pair 74Klasse 155
anlegen 153Klassenmethode 639Kombinationslistenfeld 478Kommentar 23, 251
In Jumpbar 257Konstante 37, 75Konstanten als Parameter 119Kontrollstruktur 79Konvertierung
explizite 40implizite 39
Koordinatensystem 583
Llast 65Laufvariable 88Launch Screen 325Layer 537Lazy Loading 315locale 59Lottozahlengenerator 282lowercaseString 54, 80
MMakro 310Map Kit 663map-Methode 130Markdown 253Markup-Ansicht 253Master-Detail-Beziehung 497, 510max 42maxElements 43Mehrfachvererbung 191Methode 167Methodenaufruf 445min 42minElements 43Mitteilungszentrale 655MKAnnotationView 679, 681MKCoordinateSpanMake 676MKMapView 672, 679
MKPointAnnotation 678Modulo Operator 94, 525MVC-Entwurfsmuster 277
NNachrichtenzentrale 473Named Parameter 108Navigation Controller 381Navigation Item 391Navigationsleiste 390NSCalendar 647NSCoding 464NSDate 635, 647NSDateFormatter 635NSFileManager 469NSFormatter 667NSKeyedArchiver 464NSLocale 635NSNotificationCenter 473, 548NSNumber 60NSNumberFormatter 58, 491NSObject 465, 686NSPredicate 693NSString 49NSTimer 631, 632NSURL 467NSUserDefaults 544
OObjective-C 49, 154, 174, 247, 305Objekt 155
bewegen 614identifizieren 447
Observer 474Observer Pattern 475Optional 44, 58, 74, 193, 235, 409Optional Binding 47, 55, 102Optional Chaining 196, 206OptionSetType 231Outline View 294, 323, 353, 375, 420override 186, 315, 380, 465
PPainter Model 583Pan 614Parameter 103
benannter 104, 107variadischer 115
Parameter Ellipsis 115Pattern-Match Operator 84Picker 478Picker-Steuerelement 478Pinch to Zoom 609, 618
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Stichwortverzeichnis
718
Playground 31Position des Geräts
ermitteln 663Prädikat 692Präprozessor-Makro 264print 36, 153Printer Simulator 570private 155, 168Project-Navigator 150Property List 540Property List Editor 540Property Observer 163Protokoll 199, 400Prototype Cell 505, 508public 155Punktnotation 157Punktnotations-Syntax 686Push-Benachrichtigung 661
QQuartz 2D 577Quick Look 37
RRange 55rangeOfString 55, 62Read-Eval-Print Loop (REPL) 66Rechteck
mit abgerundeten Ecken 536zeichnen 581
Refactoring 373Referenzzähler 246Regular Expressions 697Regulärer Ausdruck 697Relationship Segue 418Release Build 261repeat-while-Schleife 94Repository 435, 463, 499, 559, 699Results Sidebar 36Retina-Display 521reverse 92Reverse Geocoding 669Richtlinien 663round 41Rückgabetyp 110Rückgabewert 110RunLoop 636
SSchieberegler 352Schlüssel 74Schlüsselpfad 688
Schriftart 531Schriftgröße 531Schüttelgeste 628Schwenk 614Scope 99Segue 375, 405, 417, 513
anlegen 376Sektion 506Selektor 633Semikolon 33sendAsynchronousRequest 143Serialisierung 455setNeedsDisplay 649Setter 159, 177Settings Bundle 539, 547sort 72sortInPlace 71Speicheradresse
vergleichen 431Speicherzeiger 49Steuerelement
erzeugen 439Storyboard 371, 378, 415
erweitern 371in Navigation einbetten 390mit Datenübergabe 381
String 49String Dependency 220, 517, 688String Interpolation 50stringByTrimmingCharactersInSet 57Struktur 213Subscript 67Subscripting 63substringFromIndex 61substringToIndex 61Suchen 706Suchleiste 706Swipe 615switch-case-Struktur 85Symbol
für Schaltfläche 420Szene 372
ausblenden 410verlassen 379
TTabellenzelle 503Table View Cell 503Tableiste 416Tableisten-Controller 417Tag 447Tap 615Target-Action-Entwurfsmuster 445, 612
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
-
Stichwortverzeichnis
719
Tastatur 338ausblenden 341auswählen 338virtuelle 329
Textveröffentlichen 573
Texte verketten 50throw 241Timer 631Tupel 112Twitter 567Typ
anonymer 112Type Inference 35, 77typealias 637
UÜbergang
animierter 428Überladung 105Uhr
analoge 641Uhrzeiger 647Uhrzeit 631
ermitteln 635UIActivityViewController 566UIAlertView 347UIApplication 424, 472UIApplicationDelegate 403UIButton 291UICollectionView 553UICollectionViewCell 553UICollectionViewController 558UIColor 478, 489, 493, 582UIControl 340UIControlState 385UIEdgeInsets 560UIGestureRecognizer 609UIImageView 518, 529, 534, 562UIKit Framework 277UILabel 292, 307, 442UILocalNotification 652UINavigationController 395, 565UINavigationItem 523UIPanGestureRecognizer 614UIPickerView 482, 489UIPickerViewDataSource 484UIPinchGestureRecognizer 619UIRotationGestureRecognizer 624UISearchController 706UISlider 352, 404UIStoryboardSegue 392UISwipeGestureRecognizer 613
UISwitch 471UITableView 498, 503, 698UITableViewCell 503, 529, 533UITableViewController 503, 703UITableViewDataSource 510UITableViewDelegate 510UITapGestureRecognizer 612UITextField 329UIView 577UIViewAnimationTransition 429UIViewController 295, 308, 417Unicode 63Unit-Tests 268uppercaseString 54
VVariable 33Variablenname 34Variadischer Parameter 115Vererbung 181viewDidAppear 379viewDidLoad 307, 379viewWillAppear 379Virtuelle Tastatur 329
Wweak 394Weiterleiten
Informationen 566Wertepaar 74while-Schleife 93Whitespace 56Winkelfunktion 645Wischgeste 613Workspace-Fenster 150Wörterbücher 73
XXCTAssertNotNil 269XCTFail 268
ZZahlentypen umwandeln 50, 57Zeichenketten
teilen 61vergleichen 52
Zelleneinfärben 525Höhe 525
Zifferblatt 645Zirkelverweis 249Zufallszahl 284
© des Titels »iOS-Apps mit Swift 2« (ISBN 9783958452213) 2016 by mitp Verlags GmbH & Co. KG, Frechen. Nähere Informationen unter: http://www.mitp.de/221
top related