Inhaltsverzeichnis Danksagung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Einleitung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . An wen richtet sich das Buch? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aufbau des Buches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Teil I: Grundlagen der Sprache Swift . . . . . . . . . . . . . . . . . . . . . . . . . . Teil II: iOS-Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Swift ist nicht Objective-C Version 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stilmittel in den Listings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Frameworks der Apple-Plattformen . . . . . . . . . . . . . . . . . . . . . . . . Die Installation von Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Entwickler-Community von Apple . . . . . . . . . . . . . . . . . . . . . . . . . Webseite und Downloads zum Buch. . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 16 18 21 23 24 24 26 28 28 Teil I Grundlagen der Sprache Swift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 Datentypen und Optionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Willkommen auf dem Spielplatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablen und Konstanten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zahlendatentypen konvertieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Werte runden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Minimum und Maximum. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Datentyp Bool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Optionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmieren mit Optionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 31 33 38 41 42 43 44 46 2 2.1 2.2 2.3 2.4 Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . String Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zeichenketten vergleichen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Textabschnitte finden und ersetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . Zeichenketten in Zahlentypen konvertieren . . . . . . . . . . . . . . . . . . . . 49 50 52 54 57 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 Inhaltsverzeichnis 2.5 2.6 2.7 2.8 Die Klasse NSNumber. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Texte teilen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Subscripting mit Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anfang und Ende von Zeichenketten. . . . . . . . . . . . . . . . . . . . . . . . . . 60 61 63 65 3 3.1 3.2 3.3 3.4 Arrays und Dictionaries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays – Listen von Elementen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays sortieren und filtern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dictionaries, die schnellen Wörterbücher . . . . . . . . . . . . . . . . . . . . . . Arrays aus Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 67 71 73 77 4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 Fallunterscheidungen und Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . Die if-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die switch-case-Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die for-Schleife. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schleifen und Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rückwärts durch die for-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die while-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schleifen mit Fallunterscheidungen . . . . . . . . . . . . . . . . . . . . . . . . . . Werte als Diagramme anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gültigkeitsbereiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 79 85 88 90 91 93 94 97 99 5 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die erste Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Benannte Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funktionen mit Rückgabewert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tupel und anonyme Typen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine unbestimmte Anzahl von Parametern. . . . . . . . . . . . . . . . . . . . . Funktionen mit Standardwerten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parameter sind unveränderlich. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aliasse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 103 107 109 111 114 117 119 121 6 6.1 6.2 6.3 6.4 6.5 6.6 6.7 Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Closures sind Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Closures als Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays sortieren mit Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablen einfangen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Asynchrone Closures mit Grand Central Dispatch . . . . . . . . . . . . . . . Parallele Verarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Asynchrone Aufrufe mittels Completion-Handler . . . . . . . . . . . . . . . 125 125 127 131 135 138 141 143 6 © 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.1 7.2 7.3 7.4 7.5 7.6 7.7 Klassen und Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das erste Projekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erste Schritte im Workspace-Fenster . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse Person . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Von der Klasse zum Objekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eigenschaften und Punktnotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . Berechnete Eigenschaften mit Getter und Setter . . . . . . . . . . . . . . . . Eigenschaften beobachten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 147 150 153 155 156 157 161 8 8.1 8.2 8.3 8.4 8.5 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Methoden zur Initialisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Failable Initializers – Wenn es mal schiefgeht . . . . . . . . . . . . . . . . . . Methoden zu Deinitialisierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klassenmethoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Methoden kontra Eigenschaften. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 169 172 174 175 177 9 9.1 9.2 9.3 9.4 9.5 9.6 9.7 Vererbung und Assoziationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Erbe der Klasse Person . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erweiterungen der abgeleiteten Klasse . . . . . . . . . . . . . . . . . . . . . . . . Methoden überschreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Initialisierung abgeleiteter Klassen . . . . . . . . . . . . . . . . . . . . . . . . Assoziationen – Beziehungen zwischen Objekten . . . . . . . . . . . . . . . Optional Chaining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Coalescin Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 181 184 185 187 191 195 198 10 10.1 10.2 10.3 10.4 10.5 Protokolle und Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein eigenes Protokoll entwickeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Protokolle statt Datentypen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Optionale Protokolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensions mit Protokollen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 199 202 204 207 209 11 11.1 11.2 11.3 11.4 11.5 11.6 Strukturen und Enumerationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zurück zum Spielplatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strukturen oder Klassen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . String Dependencies – Abhängigkeiten von Zeichenketten . . . . . . . Enumerationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verschachtelte Enumerationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enumerationen mit Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 213 217 219 220 223 224 7 © 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.7 11.8 Enumerationen mit begleitenden Werten . . . . . . . . . . . . . . . . . . . . . . Binärzahlen und OptionSetType-Strukturen. . . . . . . . . . . . . . . . . . . . 226 228 12 12.1 12.2 12.3 12.4 12.5 Sicherer Programmcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funktionen absichern mit guard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . defer-Blöcke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fehler werfen mit throw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fehler auffangen mit catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 235 237 239 241 242 13 13.1 13.2 13.3 Speicherverwaltung mit Referenzzähler . . . . . . . . . . . . . . . . . . . . . . . Automatic Reference Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Starke und schwache Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zirkelverweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 247 248 249 14 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 Robuste Anwendungen und automatisierte Tests . . . . . . . . . . . . . . . Markup-Kommentare im Playground . . . . . . . . . . . . . . . . . . . . . . . . . Kommentare in Projekten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kommentare für die Jumpbar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Assertions – Die Behauptungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kompilieren als Debug oder Release . . . . . . . . . . . . . . . . . . . . . . . . . . Präprozessor-Makros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automatisiertes Testen mit Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tests für eigene Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 251 254 257 258 261 264 266 269 Teil II iOS-Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 15 15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 277 277 279 282 288 289 291 295 298 302 Lotto – 6 aus 49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MVC: Model View Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der iOS-Simulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Lottozahlengenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inspector und Bibliothek. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeiten mit dem Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zurück zum Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das war es jetzt schon? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 © 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 16 16.1 16.2 16.3 16.4 16.5 16.6 16.7 Ein Blick hinter die Kulissen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Was verbirgt sich hinter IBAction und IBOutlet? . . . . . . . . . . . . . . . . Ein View wird geladen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmstart einer iOS-Anwendung . . . . . . . . . . . . . . . . . . . . . . . . Instanzen erzeugen mit Lazy Loading . . . . . . . . . . . . . . . . . . . . . . . . . Alles dreht sich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erste Schritte mit Autolayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Icon für die App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 305 307 309 314 315 317 324 17 17.1 17.2 17.3 17.4 17.5 17.6 17.7 Eingaben mit virtuellen Tastaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . Einsatz für Autolayout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auftritt für den Assistenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tastaturen ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der First Responder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Navigation zwischen Eingabefeldern . . . . . . . . . . . . . . . . . . . . . . . . . . Aus dem View in das Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mitteilungen mit dem UIAlertView . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 331 333 338 341 343 345 347 18 18.1 18.2 18.3 18.4 18.5 Schieberegler, Textformatierungen und unendliche Werte . . . . . . . . Der Schieberegler – UISlider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Daten-Model: ConsumptionCalculator . . . . . . . . . . . . . . . . . . . . . . . . Methodenaufrufe mit Absender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Statische und dynamische Textformatierungen . . . . . . . . . . . . . . . . . Ungültige Werte erkennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 352 356 359 363 366 19 19.1 19.2 19.3 19.4 19.5 19.6 19.7 Storyboards – Mit dem Drehbuch durch die App . . . . . . . . . . . . . . . . Ein einfaches Storyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Segue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Lebenszyklus einer Szene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Storyboards mit Datenübergabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Detailansicht und Navigation Controller . . . . . . . . . . . . . . . . . . . . . . . Vorbereitungen für den Übergang. . . . . . . . . . . . . . . . . . . . . . . . . . . . Daten für die View Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 371 375 379 381 387 391 393 20 20.1 20.2 20.3 Storyboards mit Protokollen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Protokoll für den View Controller . . . . . . . . . . . . . . . . . . . . . . . . . Das UIApplicationDelegate-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . Eine Szene für das Jahr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 400 403 404 9 © 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 20.4 20.5 Verpflichtungen für den View Controller . . . . . . . . . . . . . . . . . . . . . . Kommunikation in alle Richtungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 413 21 21.1 21.2 21.3 21.4 21.5 Navigation mit einem Tableisten-Controller . . . . . . . . . . . . . . . . . . . . Der Tableisten-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konfiguration der Schaltflächen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ausflug in die Delegation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Delegate für den Tableisten-Controller . . . . . . . . . . . . . . . . . . . . . Delegation – meine Nachrichten an dich. . . . . . . . . . . . . . . . . . . . . . . 415 416 419 423 424 427 22 22.1 22.2 22.3 22.4 22.5 Grafische Oberflächen ohne Interface Builder . . . . . . . . . . . . . . . . . . Kontrolle ist gut – eine Checkliste ist besser! . . . . . . . . . . . . . . . . . . . Steuerelemente erstellen mit Swift-Anweisungen . . . . . . . . . . . . . . . Nachrichten mit Target-Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tags – Etiketten für Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Suchen im Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 434 438 444 447 448 23 23.1 23.2 23.3 23.4 23.5 23.6 23.7 Serialisierung – Aus dem Speicher in eine Datei . . . . . . . . . . . . . . . . Ein Dictionary für das Repository. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objekte sortieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alles nicht ganz so einfach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Sandbox – Apps im Sandkasten. . . . . . . . . . . . . . . . . . . . . . . . . . . Das NSCoding-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Serialisierung – Jetzt wird gespeichert! . . . . . . . . . . . . . . . . . . . . . . . . Die Nachrichtenzentrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 455 458 460 463 464 466 472 24 24.1 24.2 24.3 24.4 24.5 24.6 24.7 Der Picker – ein ganz besonderes Steuerelement. . . . . . . . . . . . . . . . Eine neue Klasse für Farben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Picker-Steuerelement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Protokolle für den Picker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kommunikation mit einem Picker. . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Farbmischer-App. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Picker-Einstellungen auslesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Von Dezimal zu Hexadezimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477 478 482 484 487 489 492 493 25 25.1 25.2 25.3 25.4 Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Showroom-App – der digitale Ausstellungsraum . . . . . . . . . . . . Wohin mit dem Daten-Model? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konfigurationen im Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . Der Tabellen-View-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 498 501 502 506 10 © 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 25.5 25.6 25.7 25.8 Zweite Szene: Die Detailansicht. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein neuer Segue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vorsicht, Fehlerquelle! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bilder anzeigen mit dem UIImageView . . . . . . . . . . . . . . . . . . . . . . . 510 513 517 518 26 26.1 26.2 26.3 26.4 26.5 26.6 26.7 Eye Candy – Unsere App soll schöner werden . . . . . . . . . . . . . . . . . . Angepasste Tabellenzellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Controller für die Tabellenzelle . . . . . . . . . . . . . . . . . . . . . . . . . . . Abgerundete Ecken und Rahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Settings – die Einstellungen einer App . . . . . . . . . . . . . . . . . . . . . . . . NSUserDefaults – die Benutzereinstellungen . . . . . . . . . . . . . . . . . . Standardeinstellungen erforderlich . . . . . . . . . . . . . . . . . . . . . . . . . . . Kommunikation mit der Nachrichtenzentrale . . . . . . . . . . . . . . . . . . 525 529 533 536 539 544 546 548 27 27.1 27.2 27.3 27.4 27.5 27.6 Der Collection View. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Storyboard mit Collection View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Collection View Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mit dem Segue zur Detailansicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Teilen mit dem UIActivityViewController. . . . . . . . . . . . . . . . . . . . . . Drucken mit AirPrint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unterschiedliche Texte für unterschiedliche Dienste. . . . . . . . . . . . . 553 553 557 563 566 570 572 28 28.1 28.2 28.3 28.4 28.5 28.6 28.7 28.8 Zeichnen mit Core Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse UIView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rechtecke zeichnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Frame und Bounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Farbige Formen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speichern der Context-Einstellungen. . . . . . . . . . . . . . . . . . . . . . . . . . Zeichnen von Farbverläufen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeiten mit Beschneidungspfaden. . . . . . . . . . . . . . . . . . . . . . . . . . . Kurven und Figuren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 577 581 585 590 593 596 599 603 29 29.1 29.2 29.3 29.4 29.5 29.6 29.7 Multi-Touch mit Gestenerkennung . . . . . . . . . . . . . . . . . . . . . . . . . . . Linien zeichnen einen Pfeil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfache Berührungserkennung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wischgesten erkennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objekte bewegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pinch to Zoom – Vergrößern mit zwei Fingern . . . . . . . . . . . . . . . . . Verschiedene Gesten gleichzeitig erkennen . . . . . . . . . . . . . . . . . . . . Objekte drehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 609 611 613 614 618 622 624 11 © 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 29.8 29.9 Gesten im Konflikt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schüttelgeste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626 628 30 30.1 30.2 30.3 30.4 30.5 30.6 Digitale und analoge Uhren mit Timern . . . . . . . . . . . . . . . . . . . . . . . Die Klasse NSTimer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wie spät ist es? – Datum und Uhrzeit ermitteln . . . . . . . . . . . . . . . . Extensions für die Klasse NSTimer . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine analoge Uhr mit Core Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Zifferblatt zeichnen mit Winkelfunktionen . . . . . . . . . . . . . . . . . Timer im Einsatz – die Uhr tickt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 631 635 636 641 645 647 31 31.1 31.2 31.3 31.4 Lokale Benachrichtigungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lokale Benachrichtigungen mit UILocalNotification . . . . . . . . . . . . . Eingehende Nachrichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Benachrichtigungen anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Push-Benachrichtigungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651 652 656 659 661 32 32.1 32.2 32.3 32.4 32.5 32.6 Karten und Koordinaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Location-Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auswerten von Positionsinformationen. . . . . . . . . . . . . . . . . . . . . . . . Geocoding – Wo bin ich hier?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Karten mit dem MKMapView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Annotations – Anmerkungen auf der Karte . . . . . . . . . . . . . . . . . . . . Benutzerdefinierte Anmerkungen gestalten und anzeigen . . . . . . . . 663 664 666 669 672 678 681 33 33.1 33.2 33.3 33.4 33.5 33.6 33.7 33.8 Daten suchen und finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zugriff mit Key Value Coding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schlüsselpfade und Aggregatfunktionen . . . . . . . . . . . . . . . . . . . . . . . Listen filtern mit NSPredicate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erweiterte Vergleiche, logische Operatoren und Closures . . . . . . . . . Prädikate mit regulären Ausdrücken . . . . . . . . . . . . . . . . . . . . . . . . . . Daten filtern für Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listen für den Tabellen-View-Controller . . . . . . . . . . . . . . . . . . . . . . . Suchen mit dem UISearchController. . . . . . . . . . . . . . . . . . . . . . . . . . 685 685 688 692 695 697 698 703 706 Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715 12 © 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 1 Datentypen und Optionals Im grundlegenden Umgang mit Variablen und Werten sind sich die meisten modernen Programmiersprachen sehr ähnlich und unterscheiden sich oft nur in der verwendeten Syntax. Swift ist dabei keine Ausnahme, und wenn Sie schon mit anderen Sprachen gearbeitet haben, wird Ihnen der Inhalt der nächsten Seiten bestimmt vertraut vorkommen. Trotzdem sollten Sie dieses Kapitel nicht überspringen, denn Swift bietet einige Besonderheiten und Anweisungen, die man in anderen Sprachen nicht findet. Selbst bei einfachen und alltäglichen Dingen, wie zum Beispiel der Addition von Variablen, können erfahrene Entwickler durch Swift 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 Playground Programmcode schreiben, wird Ihnen das Ergebnis Ihrer Arbeit oft sofort in einer Seitenleiste neben dem Texteditor angezeigt, die von Apple als Results Sidebar bzw. als Ausgabebereich bezeichnet wird. Dort können Sie leicht überprüfen, ob die eingegebenen Anweisungen korrekt sind und das gewünschte Ergebnis liefern. Der Spielplatz eignet sich hervorragend, um neue Dinge auszuprobieren und zu testen, oder sich – wie in unserem Fall – mit Swift vertraut zu machen. Einen neuen Playground können Sie direkt vom Welcome-to-Xcode-Fenster aus erstellen, das beim Start der Entwicklungsumgebung angezeigt wird. Wählen Sie dort GET STARTED WITH A PLAYGROUND. Möchten Sie zu einem bereits bestehenden Projekt einen Playground hinzufügen, führt der Weg über die Menüpunkte FILE, NEW und FILE... Ein Playground der Plattform iOS unterscheidet sich von einem OS-X-Spielplatz nur durch die Anweisung, mit der das zugehörige Framework für die grafischen Oberflächen importiert wird. iOS-Apps arbeiten mit UIKit, während für OS X das Cocoa Framework importiert wird. Für unsere ersten Schritte benötigen wir jedoch nur das Foundation Framework und somit ist es egal, für welche Plattform Sie den Playground erzeugen. Foundation ist sowohl in UIKit als auch in Cocoa enthalten. Nennen Sie Ihren ersten Playground Datentypen und speichern Sie die Datei an einem Ort, an dem Sie sie später leicht wiederfinden. Sie sollten immer 31 © 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 1 Datentypen und Optionals bemüht sein, Ihre Projekte gut zu organisieren, um die Übersicht nicht zu verlieren und Dinge schnell finden zu können. Nachdem Xcode den Playground angelegt hat, öffnet die Entwicklungsumgebung ein in zwei Bereiche geteiltes Fenster. Die linke Seite ist der Editor, in den wir unsere Anweisungen schreiben können. Die rechte Seite wird als Ausgabebereich bezeichnet und dient zur Ausgabe von Werten und Variablen. Neben der import- 32 © 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.2 Variablen und Konstanten Anweisung und einem Kommentar gibt es im Programm sogar schon einen Befehl. Mit var str = "Hello, playground" wird der Variablen str der Text Hello, playground zugewiesen, der daraufhin im Ausgabebereich angezeigt wird. Da wir uns mit Texten erst später beschäftigen, können Sie die Anweisung entfernen. Löschen Sie aber nicht versehentlich den import-Befehl. Ohne ein geladenes Framework kann es in einem Swift-Programm zu verwirrenden Fehlermeldungen kommen, deren wahre Ursache nur schwer zu erkennen ist. 1.2 Variablen und Konstanten Lassen Sie uns bei der Reise in die Welt der Swift-Programmierung mit etwas ganz Einfachem beginnen. Wie alle modernen Programmiersprachen bietet Swift die Möglichkeit, im Programmcode Variablen zu deklarieren und ihnen Werte zuzuweisen. Der von Xcode vorbereitete Playground hat das mit seiner Anweisung schon gut demonstriert. Für verschiedene Anwendungsfälle kommen dabei dann unterschiedliche Datentypen zum Einsatz. Soll mit den Werten gerechnet werden, fällt die Wahl in der Regel auf die Typen Int, Double oder Float, je nach der erforderlichen Genauigkeit. Das nachfolgende kurze Listing zeigt beispielhaft die Definition zweier Variablen mit dem Befehl var und zwei unterschiedlichen Datentypen. Wenn Sie alle Anweisungen richtig eingegeben haben, wird Xcode im Ausgabebereich des Playground-Fensters die Inhalte der Variablen anzeigen. An dieser Stelle erneut der Hinweis, dass die Anweisungen auch funktionieren, wenn Sie die Befehlszeilen aus Gewohnheit mit einem Semikolon abschließen. 33 © 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 1 Datentypen und Optionals var age:Int = 43 var taxRate:Double = 9.5 Um welche Typen es sich bei den Variablen in unserem Code handelt, können Sie vermutlich auch ohne jahrelange Erfahrung in der Softwareentwicklung und ohne die explizite Angabe des Typs schnell selbst erkennen. Die Variable age ist eine ganze Zahl, ein sogenannter Integer. Bei taxRate finden wir Nachkommastellen, sodass es sich um eine Dezimalzahl handeln muss. Dort sollte dann der Typ Double oder Float verwendet werden, denn als ganze Zahl ließe sich dieser Wert nur unvollständig ablegen. Wichtig Für Variablennamen wird in Swift die Lower-Camel-Case-Schreibweise verwendet. Der erste Buchstabe im Namen ist ein kleiner Buchstabe, alle weiteren Wörter, aus denen der Name gebildet wird, beginnen mit einem Großbuchstaben. Beispiele für aussagekräftige Namen wären arrayOfSelectedItems oder firstDayInMonth. Unterstriche in Bezeichnern sind in Swift nicht üblich. Wie Sie sicher bestätigen können, geben die Werte selbst schon genau vor, welcher Datentyp verwendet werden muss, und so ist es in Swift oftmals gar nicht notwendig, den Typ einer Variablen bei der Definition explizit anzugeben. Der Compiler kann den Typ selbst erkennen. Die Definitionen der beiden Variablen würden in Swift daher auch so funktionieren: var age = 43 var taxRate = 9.5 34 © 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.2 Variablen und Konstanten Diese automatische Typerkennung des Compilers, die in der englischen Dokumentation als »Type Inference« bezeichnet wird, funktioniert in Swift sehr gut, sodass bei den meisten Variablen auf eine explizite Angabe des Datentyps verzichtet wird. Als Entwickler kann man jedoch sicher sein, dass der Compiler den richtigen Typ auswählt. Außerdem wird der Programmcode so kürzer und besser lesbar, worauf man bei Apple sehr viel Wert legt. Für das Programm selbst ändert sich dabei jedoch nichts. Die Variable age ist weiterhin eine ganze Zahl und für Dezimalbrüche wie taxRate wählt der Compiler immer den Typ Double, weil dieser im Vergleich zu Float über eine größere Genauigkeit verfügt. Bei beiden Variablen wird der Typ aus den zuerst zugewiesenen Werten ermittelt. Spätere Änderungen auf einen anderen Typ sind nicht möglich. Wurde eine Variable als Int festgelegt, können Sie ihr anschließend keine Zeichenkette zuweisen. Das folgende Beispiel wird nicht funktionieren, wie Sie in Ihrem Playground leicht ausprobieren können. Durch Anklicken des Fehlersymbols links neben dem Programmcode können Sie die Fehlermeldung ein- oder ausblenden. var age = 43 var taxRate = 9.5 age = "19" Die Deklaration und Definition einer Variablen muss in Swift keineswegs immer in einer Programmzeile geschehen, die Anweisungen können auf mehrere Zeilen verteilt werden. Jetzt ist der Compiler jedoch nicht mehr in der Lage, den Typ der Variablen selbstständig zu erkennen, und benötigt unsere Hilfe. Der Typ muss bei der Deklaration wieder explizit angegeben werden. 35 © 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 1 Datentypen und Optionals var age:Int var taxRate:Double age = 43 taxRate = 9.5 Wie groß der Wert einer Variablen sein kann, hängt teilweise von der Systemarchitektur ab, auf der das Programm ausgeführt wird. Auf einem 32-Bit-System wird für den Typ Int ein 32 Bit langes Datenwort verwendet, das den möglichen Wert auf einen Bereich von -2.147.483.648 bis 2.147.483.647 eingrenzt. Auf Systemen mit einer 64-Bit-Architektur ist Int ein 64 Bit langes Datenwort und kann Werte zwischen -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 die Datentypen Int8, Int16, Int32 und Int64 verwendet werden. Der Typ Float ist auf jedem System ein 32-Bit-Datenwort, Double hingegen immer 64 Bit lang. Welche Werte auf Ihrem System möglich sind, können Sie mit den folgenden vier Aufrufen der print-Funktion herausfinden. // 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) Ein Aufruf der Funktion print in einem Playground führt zu einer Ausgabe in der Results Sidebar. Dort wird der Wert direkt neben der zugehörigen Anweisung angezeigt. Der Ausgabebereich ist jedoch nicht der einzige Ort, an dem die Entwicklungsumgebung die Ausgaben von print anzeigt, zusätzlich werden sie in die Konsolenansicht geschrieben. Diese ist in der Standardkonfiguration eines Playgrounds allerdings immer unsichtbar und muss erst eingeblendet werden. Die Schaltfläche HIDE OR SHOW THE DEBUG AREA aus der Symbolleiste erledigt das. In der Konsole stehen die minimalen und maximalen Werte nicht neben den 36 © 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.2 Variablen und Konstanten Anweisungen, sondern erscheinen in der Reihenfolge, in der sie mit print ausgegeben wurden. In Xcode-Projekten für iOS-Apps oder OS-X-Anwendungen steht Ihnen während der Entwicklung kein Ausgabebereich zur Verfügung, und Ihre Anweisungen werden dort auch nicht automatisch sofort nach der Eingabe ausgeführt. Das funktioniert nur im Playground. Die Konsolenansicht gibt es jedoch auch dort und kann für Ausgaben genutzt werden. Zögern Sie nicht, print zu verwenden, um den Programmablauf Ihrer Anwendungen nachzuvollziehen oder Werte anzuzeigen. Ein Aufruf von print verrät Ihnen nicht selten schneller etwas über Ihr Programm als die Analysewerkzeuge der Entwicklungsumgebung. Wenn Sie den Mauspfeil auf einen Wert im Ausgabebereich bewegen, werden dort die Schaltflächen für Inline Results und Quick Look sichtbar. Beide Funktionen bieten 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 verschwindet, sobald ein beliebiger anderer Punkt auf dem Bildschirm angeklickt wird. Die Ausgabe eines Inline Results bleibt sichtbar, bis sie wieder deaktiviert wird. Während Variablen zur Laufzeit eines Programms jederzeit neue Werte, allerdings nur desselben Typs, zugewiesen werden können, ist dies bei Konstanten nicht möglich. Konstanten werden in Softwareprojekten daher oft zur Konfiguration eingesetzt, um Werte einer Anwendung leichter zu verwalten und »magische Zahlen« zu vermeiden. Dabei handelt es sich um Zahlenwerte, die direkt im Programmcode stehen und deren Aufgaben oft nur schwer erkennbar sind. Eine Konstante mit einem aussagekräftigen Namen kann dann sehr zur Lesbarkeit des Codes betragen. In Swift werden Konstanten über den Befehl let erzeugt. Das nachfolgende Listing zeigt die Definition der Zahl Pi sowie einer Serveradresse als Zeichenkette. 37 © 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 1 Datentypen und Optionals let pi = 3.14159265359 let server = "http://cocoa-coding.de" In den ersten Versionen von Swift war es bei einer Konstanten nicht möglich, Deklaration und Definition auf mehrere Programmzeilen zu verteilen, das funktionierte selbst dann nicht, wenn der Typ explizit angegeben wurde. Seit Swift 2.0 können Deklaration und Definition getrennt werden, in vielen anderen Programmiersprachen funktioniert das bei Konstanten nicht. let pi:Double pi = 3.14159265359 let server:String server = "http://cocoa-coding.de" Eine nachträgliche Änderung des zugewiesenen Wertes ist anschließend nicht mehr möglich. Eine Konstante ist unveränderlich, und der Compiler wird bei dem Versuch, Änderungen vorzunehmen, Fehlermeldungen ausgeben. Wichtig Swift und Xcode erlauben bei der Entwicklung die Verwendung sämtlicher Unicode-Zeichen als Variablennamen. So können Sie beispielsweise statt des Variablennamens pi auch das Zeichen U+30C0 (Greek Small Letter Pi) verwenden. Inwieweit dies die Programmierung leichter und übersichtlicher macht, sollten Sie für sich selbst entscheiden. Empfehlen kann man diese Vorgehensweise vermutlich nur in Ausnahmefällen. let π = 3.14159265359 1.3 Zahlendatentypen konvertieren Nicht selten gibt es in Programmen Situationen, bei denen die Inhalte von mehreren Variablen zu einem Wert zusammengefasst werden müssen. Ein sehr gutes Beispiel sind mathematische Berechnungen, die aus einzelnen Werten ein Ergebnis ermitteln. Swift unterscheidet sich dabei nicht von anderen Programmiersprachen und unterstützt eine Vielzahl von Rechenoperatoren. Wie nicht anders zu erwarten, gilt immer Punkt- vor Strichrechnung. var a = 75 var b = 100 var c = 5 let sum1 = a + b * c let sum2 = (a + b) * c 38 © 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.3 Zahlendatentypen konvertieren Beachtenswert im gezeigten Beispiel ist der Umstand, dass auch das Ergebnis einer Berechnung einer Konstanten zugewiesen werden kann. Im Unterschied zu einigen anderen Programmiersprachen muss der Wert einer Konstanten in Swift nicht zwangsläufig während der Kompilierung bekannt sein, obwohl er sich in diesem Beispiel durchaus ermitteln ließe. Sogar eine Textfeldeingabe, die erst nach dem Start der Anwendung vorgenommen wird, kann in Swift einer Konstanten zugewiesen werden. Solange wir uns bei den Rechenoperationen auf nur einen Datentyp beschränken, können wir ohne Probleme programmieren. Schwierig wird es erst, wenn unterschiedlichen Typen verwendet werden. Dann kann schon eine einfache Addition zu Problemen führen: var a = 75 var b = 3.8 // Die Addition unterschiedlicher Datentypen // führt zu einer Fehlermeldung! let sum = a + b Auch ohne Angabe eines Typs können wir die Variable a als ganze Zahl und somit vom 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 nicht explizit als Float angegeben wird. Doch welchen Typ muss man einsetzen, wenn die beiden Variablen addiert werden sollen? Mit einem weiteren Double wäre sichergestellt, dass der Nachkommateil der Summe nicht verloren geht, aber in manchen Situationen ist vielleicht genau das gewünscht und man möchte nur ganze Zahlen. Weil der Swift-Compiler diese Entscheidung nicht eigenständig treffen kann, führt die Addition zu einem Fehler. Schuld daran sind die unterschiedlichen Datentypen. Leider ist die Meldung der Entwicklungsumgebung nicht 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, welcher Typ verwendet werden soll. Bei einer Berechnung, die sowohl Int als auch Double-Typen verwendet, würde vermutlich ein Double für das Ergebnis verwendet, um eine bestmögliche Genauigkeit zu gewährleisten. Allerdings gibt es keine Regel, dass dies so sein muss, und Programmiersprachen mit anderen Compilern können sich anders verhalten. Damit der Entwickler sich nicht auf Vermutungen 39 © 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 1 Datentypen und Optionals verlassen muss, ist in Swift eine implizite Konvertierung nicht möglich. Die gezeigte Fehlermeldung ist die Folge. Bei einer expliziten Konvertierung muss der gewünschte Typ im Programm genau festgelegt werden, was somit zu einer Aufgabe für uns Programmierer wird. Soll das Ergebnis vom Typ Double sein, müssen wir den Compiler anweisen, die Variable a vor der Addition mithilfe einer Funktion in einen Double-Typ zu konvertieren. Sind beide Summanden vom gleichen Typ, ergibt sich der Typ für die Summe. // Die Double-Funktion: // a wird zunächst in einen Double-Typ umgewandelt // c wird so zu einem Double-Typ var sumDouble = Double(a) + b Wollen wir unser Ergebnis lieber als ganze Zahl, muss die Variable b konvertiert werden. Doch Vorsicht, gerundet wird die Zahl von der Int-Funktion nicht! Die Nachkommastellen werden abgeschnitten, aus 3,8 wird 3 und die Summe der Addition somit 78! Mit einer expliziten Konvertierung erhalten wir immer den gewünschten Typ und sind nicht von der Entscheidung eines Compilers abhängig. // Die Int-Funktion: // b wird zunächst in einen Int-Typ umgewandelt // c wird so zu einem Int-Typ var sumInt = a + Int(b) Die gezeigten Arten der Konvertierung entsprechen einer Umwandlung, die als »cast« oder »typecasting« bezeichnet wird, in Swift allerdings mit einer etwas ungewöhnlichen Syntax. Viele andere Programmiersprachen verwenden eine Schreibweise, bei der dem zu konvertierenden Wert der gewünschte Typ in runden Klammern vorangestellt wird. Dort sieht es so aus: // Typecasting, wie es in anderen Sprachen // angewendet wird. // var sum = (Double)a + b Möchte man in einem Swift-Programm zwei Int-Werte addieren, das Ergebnis aber als Double erhalten, ist das ebenfalls nur ein kleines Problem. In den runden Klammern der Funktionen kann die Addition programmiert werden. So ist es nicht erforderlich, beide ganze Zahlen einzeln zu konvertieren. var x = 100 var y = 60 // Einzelne Konvertierung, nicht erforderlich 40 © 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.4 Werte runden // var sum = Double(x) + Double(y) // Konvertierung der Summe var sum = Double(x + y) 1.4 Werte runden Bei einer expliziten Konvertierung von Double zu Int sämtliche Nachkommastellen abzuschneiden, kann gewünscht sein, doch nicht weniger oft möchte man den Wert zuvor runden. Diese Aufgabe kann die Funktion round übernehmen. Wie Sie mit den folgenden Anweisungen selbst ausprobieren können, wird ab einem Nachkommawert von .5 aufgerundet, ansonsten wird abgerundet. 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 Soll der gerundete Wert dann zu einem Int-Typ werden, spricht nichts dagegen, verschiedene Anweisungen zu verschachteln. So kann man im Code eine Zeile einsparen, ohne dabei allzu viel Lesbarkeit einzubüßen. var a2 = 99.50 var r2 = Int(round(a2)) // r2 ist jetzt 100 und vom Typ Int Zwei weitere wichtige Funktionen zur Manipulation von Double-Werten sind floor und ceil. Sie liefern den nächstniedrigeren und nächsthöheren ganzzahligen Wert, vollkommen unabhängig vom Wert hinter dem Komma. Das Ergebnis ist weiterhin ein Double. var aValue = 99.001 var c = ceil(aValue) 41 © 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 1 Datentypen und Optionals // c ist jetzt 100.0 var f = floor(aValue) // f ist jetzt 99.0 Einige Entwickler, die ich kennengelernt habe, hatten Schwierigkeiten, sich die Funktionsweisen von floor und ceil zu merken und diese zu unterscheiden. Denken Sie dabei an die englischen Begriffe. floor ist der Fußboden und somit der niedrige, untere Wert. ceil ist eine Abkürzung für ceiling, die Zimmerdecke. Bei dieser Funktion bekommen wir den höheren, oberen Wert. Die Zimmerdecke ist 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 dies mit einer if-Struktur sicherlich leicht programmieren. Etwas eleganter sind die in Swift bereits vorhandenen Funktionen max und min. 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) Eine besondere Erklärung ist an dieser Stelle vermutlich nicht nötig. Erwähnenswert ist jedoch, dass die beiden Funktionen in Swift auch mehr als zwei Werte verarbeiten können. Bei den ähnlichen Funktionen anderer Programmiersprachen ist das nicht möglich. Allerdings müssen sämtliche Werte vom gleichen Typ sein, also ausschließlich Double, Float oder Int. 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 42 © 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.6 Der Datentyp Bool // Double-Typen ermitteln var maximum = max(m1,m2,m3,m4) var minimum = min(m1,m2,m3,m4) Eine Alternative zu min und max bieten die beiden Funktionen minElements und maxElements, die jedoch beide eine Auflistung des Typs Array als Parameter erwarten. Mit diesen Listen werden wir uns in Kapitel 3 noch genauer beschäftigen. Um die Funktionen auf unsere vier Variablen anzuwenden, genügt es für den Augenblick, die Bezeichner zusätzlich in eckige Klammern einzufassen. Sämtliche Funktionen akzeptieren neben Variablen und Konstanten auch feste Werte, die unveränderlich im Programmcode stehen. var minValue = minElement([m1, m2, m3, m4]) var maxValue = maxElement([4.5, 4.0, 3.9, 4.4]) 1.6 Der Datentyp Bool Einen Datentyp, den man in diesem Kapitel nicht unterschlagen sollte, ist der Typ Bool, benannt nach dem englischen Mathematiker George Boole. Eine Variable oder Konstante des Typs Bool kann ausschließlich die Werte true oder false annehmen und wird deshalb fast ausnahmslos dazu verwendet, um eine bestimmte Aussage als wahr oder unwahr zu kennzeichnen. Wenn wir uns in Kapitel 4 mit Fallunterscheidungen beschäftigen, wird der Typ Bool daher eine große Rolle spielen. // Zuweisungen boolescher Typen // mit Angabe des Datentyps var valueB1:Bool = true // Ohne Angabe des Datentyps var valueB2 = false In einigen anderen Programmiersprachen kann ein Bool alternativ durch Zahlenwerte gesetzt werden, wobei 0 einem false und jeder andere Wert einem true 43 © 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 1 Datentypen und Optionals entspricht. Weil so die Lesbarkeit des Codes aber sehr beeinträchtigt wird, gibt es diese Möglichkeit in Swift 2.0 nicht mehr. Die aus Objective-C bekannten Werte YES und NO funktionieren in Swift ebenfalls nicht. // Alternative Zuweisung von Zahlen // Funktioniert in Swift 2.0 nicht mehr var value1:Bool = 1 var value2:Bool = 0 1.7 Optionals Einer der größten Unterschiede zwischen Objective-C und Swift ist die Möglichkeit, Variablen und Konstanten im Programmcode als Optional zu deklarieren und ihnen damit die Fähigkeit zu geben, alternativ zu einem Wert den Zustand nil anzunehmen. Ein Optional ist nil, wenn ihm noch kein Wert zugewiesen wurde oder sein Zustand explizit unbestimmt sein soll. Haben Sie das alles sofort verstanden? Zugegeben, das klingt sehr technisch, aber so ist die Softwareentwicklung gelegentlich. Möchte man Optionals an einem Beispiel aus dem Alltag erklären, muss man dafür ein wenig ausholen: Stellen Sie sich ein digitales Thermometer vor, dessen gemessene Temperatur von einer Software verwaltet und angezeigt werden soll. Im Sommer erreicht das Thermometer Temperaturen von über 30 Grad, im Winter hingegen Werte unter 0 Grad. So ergibt sich ein großer Bereich von möglichen Temperaturen, wobei es sich immer um Dezimalzahlen handelt. In der Software scheint der Datentyp Double daher bestens geeignet, die ermittelte Temperatur aufzunehmen und zur Anzeige zu bringen. Wie Sie inzwischen wissen, müssen Variablen und Konstanten aber mit einem Wert initialisiert werden, bevor man das erste Mal lesend auf sie zugreifen kann. Es gibt Situationen, in denen eben dies zu einem Problem wird. Solange das Thermometer funktioniert, hat das Programm mit der Temperatur und dem Typ Double keine Schwierigkeiten. Problematisch wird es erst, wenn das Thermometer ausfällt oder von der Software aus einem anderen Grund keine Daten mehr empfangen werden können. Mit welcher Temperatur haben wir es dann zu tun und welcher Wert soll dann angezeigt werden? Eine Möglichkeit wäre es, die Variablen mit dem Wert 0 zu initialisieren und somit 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 in unserem Bereich, und wenn im Programm mit diesem Wert gearbeitet wird, sollte man davon ausgehen können, dass die Temperatur so gemessen wurde. Die Software benötigt zusätzliche Informationen darüber, ob ein gemessener Wert vor- 44 © 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.7 Optionals 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 tatsächlich um eine gemessene Temperatur handelt, ließe sich mit einer zusätzlichen booleschen Variablen abbilden. Oder Sie verwenden einen Optional! In Swift kann jeder Typ zu einem Optional werden, allerdings ist es bei der Definition einer Variablen oder Konstanten erforderlich, diese Erweiterung explizit anzugeben, denn dass eine Variable oder Konstante ein Optional sein soll, kann der Compiler nicht eigenständig erkennen. Er würde immer einen regulären Typ einsetzen 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 ein Fragezeichen 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 Playground eingeben, wird Ihnen Xcode für die Variable temperatur1 den Wert 32.5 im Ausgabebereich ausgeben. Für temperatur2 erhielten Sie in der Vergangenheit die Ausgabe { Some 32.5}, wobei Some ein Hinweis auf einen Optional war. In der momentan aktuellen Xcode-Version wird das Some leider nicht mehr angezeigt. // Definition einer Variablen var temperatur1:Double = 32.5 // Definition einer Variablen als Optional var temperatur2:Double? = 32.5 Eindeutig werden die Informationen der Entwicklungsumgebung, wenn Sie die beiden Variablen mit der print-Funktion ausgeben. Zusätzlich zum Wert für temperatur2 wird jetzt das Wort Optional angezeigt. ... // Ausgabe der beiden Variablen print(temperatur1) print(temperatur2) 45 © 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 1 Datentypen und Optionals Besonders interessant verhält sich der Playground, wenn Sie für die beiden Variablen die Zuweisungen der Werte entfernen. Die Variable temperatur2 ist ein Optional und kann legitim ohne Wert verwendet werden. Ihr Zustand ist dann automatisch nil und genau das wird im Ausgabebereich angezeigt, sobald man die Zuweisung entfernt. // Definition einer Variablen var temperatur1:Double = 32.5 // Definition einer Variablen als Optional var temperatur2:Double? // Ausgabe der beiden Variablen print(temperatur1) print(temperatur2) Löscht man die Zuweisung für die Variable temperatur1, kommt es sofort zu einer Fehlermeldung. Eine reguläre Variable muss vor der ersten Verwendung mit einem Wert initialisiert werden, sonst kann sie nicht ausgegeben werden. In Objective-C bekam man es mit nil zu tun, wenn ein Speicherzeiger auf kein gültiges Objekt verwies, und das war nicht immer ein gewünschter Zustand. In Swift ist nil bei einem Optional hingegen ein legitimer Wert. Er sagt aus, dass es für die Variable keinen Wert gibt. Um dies zu ermöglichen, muss der Typ aber explizit 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 zum Einsatz kommen könnte, zeigt das folgende Beispiel. Ist die Variable temp gleich nil, wird der Text Keine Messung ausgegeben, gibt es hingegen einen Wert, finden wir stattdessen die Temperatur im Ausgabebereich. Probieren Sie das in Ihrer Entwicklungsumgebung aus. 46 © 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.8 Programmieren mit Optionals var temperatur:Double? = 18.2 if temperatur == nil { print("Keine Messung") } else { print(temperatur!) } Vereinfacht beschrieben, hat man es bei einem Optional immer mit zwei Werten zu tun. Wird eine Variable oder Konstante mit ihrem Namen angesprochen, kann man ausschließlich Informationen darüber erhalten, ob der Optional nil ist oder nicht. Ist der Zustand nicht nil, muss zunächst ein »Auspacken« stattfinden (Unwrapping in der englischen Dokumentation), um an den eigentlichen Wert zu gelangen. 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 Entwicklungsumgebung 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 Fehler. Vergleiche mit der if-Struktur werden wir uns in den folgenden Kapiteln genauer 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 wird der Optional in der if-Struktur einer neuen Konstanten oder Variablen zugewiesen. Ist die Zuweisung erfolgreich, ist der Wert also nicht nil, erhält man den Wert automatisch in einer regulären Variablen, die aber nur innerhalb der ifStruktur verwendet werden kann. var temperatur:Double? = 18.2 if let temp = temperatur { print(temp) } else { print("Keine Messung") } 47 © 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 1 Datentypen und Optionals Für Umsteiger ist das Optional Binding vielleicht etwas gewöhnungsbedürftig, es lohnt sich aber sehr, diese Schreibweise zu verwenden, da sie zu kurzem und übersichtlichem Code führt. Optionale Typen kommen in Swift bei vielen Klassen und Strukturen zum Einsatz, sodass wir uns später noch mal mit diesem Thema beschäftigen werden. 48 © 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 Symbole #define 306 A Activity Item 567 Adresse ermitteln 669 advancedBy 64 Aggregatfunktion 692 AirPrint 570 Alias 121 Analoge Uhr mit Zeigern 641 Animierter Übergang 428 Annotation 678 Anonymer Typ 112 AnyObject 70, 76, 202, 297, 359, 637 Application Kit 24 Argumente 103 Array 67 as-Anweisung 392 Assertion 260 Assistant Editor 354 Assistent 333 Associated Values 227 Assoziation 191 Ausgabebereich 32 Ausrichtung verhindern 565 Autolayout 317, 331 Automatic Reference Counting 174, 247 B Badge 659 Bar Button Item 396, 405 Benachrichtigung 652 Benannter Parameter 104, 107 Beobachter-Entwurfsmuster 475 Berechnete Eigenschaft 157 Berührungserkennung 611 Beschneidungspfad 599 Bézierkurve 603 Bilddatei hinzufügen 521 Binärzahl 230 Bit 230 Bitmuster 230 Bool 43 Boolescher Operator 83, 84 break 87, 95 Bundle 657 Button 291 C catch 242 ceil 41 CGColor 582 CGFloat 495, 560 CGPoint 439 CGRect 439 CGRectMake 439, 579, 583, 644 CGSize 439 characters 52 Checkbox 440 CLGeocoder 669 Clipping Path 599 CLLocationManager 664 Closed Range 89 Closure 71, 126, 459, 637, 669, 696 Coalescing Operator 198 Cocoa Framework 24 Cocoa Touch Framework 26 Collection View 553 Combobox 478 compare 53 Completion Handler 128 Constraints 317 aktualisieren 390 automatisch anpassen 321 continue 96 Controller 295 Convenience Initializer 191, 214, 479, 493 Core Graphics 577, 642 Core Location 663 count 52, 69 D Dateinamen anhängen 467 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 Stichwortverzeichnis Datum ermitteln 635 Debugger-Ansicht 88 Debug-Version 261 default 87 deinit 174, 380, 634 Delegate 403, 423 Delegation 423 Designated Initializer 172, 189, 192, 380, 479 Dezimaltrennzeichen 363 Dictionary 73, 284, 456, 660 dispatch_after 139 dispatch_async 141 distanceTo 62 Double Tap 626 dropFirst 66 dropLast 66 Drucken 571 E Eigenschaft 156 berechnete 157 Eingabefeld 329 Ellipse 592 Ellipsis Operator 115 else if 82 E-Mail 567 Emoji 63 Enumeration 220 Erinnerung 652 Error-Handling 239 ErrorType 241 Explizite Konvertierung 40 Extension 207, 637 External Parameter Name 108 F Facebook 567 Factory-Methode 176 Failable Initializer 172, 195 fallthrough 86 Farben 482 Farbmischer 489 Farbverlauf 596 Fast Enumeration 91 filter 73 Filtern 692 first 65 First Responder 341 floor 41 fmin 643 for-in-Schleife 89, 91 format 51 Format Specifier 51, 360, 494, 635 for-Schleife 88, 286, 645, 702 Forward Geocoding 670 Foundation Framework 25, 31, 153 Frame 439 Funktion 103 G Geocoding 669 Gestenerkennung 609 Getter 158, 177 GPS-Sensor 665 Grafik für Retina-Display 421 Grand Central Dispatch 138 Groß- und Kleinschreibung 53, 71, 80 guard-Struktur 235 Gültigkeitsbereich 99 H Half-Open Range 89 hasPrefix 80 hasSuffix 79 Human Interface Guidelines 293 I IBAction 295, 305 erstellen 336 IBOutlet 295, 305 erstellen 335 Icon 324 if-Struktur 79 Implizite Konvertierung 39 Indexpositionen 113 indices 62 Info.plist 663, 708 init 170 Inline Closure 135 Inline Result 37, 97, 104, 105 inout 120 Inspector 289 Instanziierung 155 Instanzvariable 156 Interface Builder 288 internal 155 iOS-Simulator 280 Ausrichtung 316 Home-Button 281 Koordinaten eingeben 668 isEmpty 52, 157 isKindOfClass 614 Iteration 91 J Jumpbar 257, 336, 533 716 © 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 K Kapselung 169, 404, 501, 685 Karte 663 Callout 682 eigenen Ort anzeigen 672 Maßstab 676 Stecknadel 681 kCFBundleNameKey 657 Key Path 688 Key Value Coding 685, 686 Key Value Pair 74 Klasse 155 anlegen 153 Klassenmethode 639 Kombinationslistenfeld 478 Kommentar 23, 251 In Jumpbar 257 Konstante 37, 75 Konstanten als Parameter 119 Kontrollstruktur 79 Konvertierung explizite 40 implizite 39 Koordinatensystem 583 L last 65 Laufvariable 88 Launch Screen 325 Layer 537 Lazy Loading 315 locale 59 Lottozahlengenerator 282 lowercaseString 54, 80 M Makro 310 Map Kit 663 map-Methode 130 Markdown 253 Markup-Ansicht 253 Master-Detail-Beziehung 497, 510 max 42 maxElements 43 Mehrfachvererbung 191 Methode 167 Methodenaufruf 445 min 42 minElements 43 Mitteilungszentrale 655 MKAnnotationView 679, 681 MKCoordinateSpanMake 676 MKMapView 672, 679 MKPointAnnotation 678 Modulo Operator 94, 525 MVC-Entwurfsmuster 277 N Nachrichtenzentrale 473 Named Parameter 108 Navigation Controller 381 Navigation Item 391 Navigationsleiste 390 NSCalendar 647 NSCoding 464 NSDate 635, 647 NSDateFormatter 635 NSFileManager 469 NSFormatter 667 NSKeyedArchiver 464 NSLocale 635 NSNotificationCenter 473, 548 NSNumber 60 NSNumberFormatter 58, 491 NSObject 465, 686 NSPredicate 693 NSString 49 NSTimer 631, 632 NSURL 467 NSUserDefaults 544 O Objective-C 49, 154, 174, 247, 305 Objekt 155 bewegen 614 identifizieren 447 Observer 474 Observer Pattern 475 Optional 44, 58, 74, 193, 235, 409 Optional Binding 47, 55, 102 Optional Chaining 196, 206 OptionSetType 231 Outline View 294, 323, 353, 375, 420 override 186, 315, 380, 465 P Painter Model 583 Pan 614 Parameter 103 benannter 104, 107 variadischer 115 Parameter Ellipsis 115 Pattern-Match Operator 84 Picker 478 Picker-Steuerelement 478 Pinch to Zoom 609, 618 717 © 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 Playground 31 Position des Geräts ermitteln 663 Prädikat 692 Präprozessor-Makro 264 print 36, 153 Printer Simulator 570 private 155, 168 Project-Navigator 150 Property List 540 Property List Editor 540 Property Observer 163 Protokoll 199, 400 Prototype Cell 505, 508 public 155 Punktnotation 157 Punktnotations-Syntax 686 Push-Benachrichtigung 661 Q Quartz 2D 577 Quick Look 37 R Range 55 rangeOfString 55, 62 Read-Eval-Print Loop (REPL) 66 Rechteck mit abgerundeten Ecken 536 zeichnen 581 Refactoring 373 Referenzzähler 246 Regular Expressions 697 Regulärer Ausdruck 697 Relationship Segue 418 Release Build 261 repeat-while-Schleife 94 Repository 435, 463, 499, 559, 699 Results Sidebar 36 Retina-Display 521 reverse 92 Reverse Geocoding 669 Richtlinien 663 round 41 Rückgabetyp 110 Rückgabewert 110 RunLoop 636 S Schieberegler 352 Schlüssel 74 Schlüsselpfad 688 Schriftart 531 Schriftgröße 531 Schüttelgeste 628 Schwenk 614 Scope 99 Segue 375, 405, 417, 513 anlegen 376 Sektion 506 Selektor 633 Semikolon 33 sendAsynchronousRequest 143 Serialisierung 455 setNeedsDisplay 649 Setter 159, 177 Settings Bundle 539, 547 sort 72 sortInPlace 71 Speicheradresse vergleichen 431 Speicherzeiger 49 Steuerelement erzeugen 439 Storyboard 371, 378, 415 erweitern 371 in Navigation einbetten 390 mit Datenübergabe 381 String 49 String Dependency 220, 517, 688 String Interpolation 50 stringByTrimmingCharactersInSet 57 Struktur 213 Subscript 67 Subscripting 63 substringFromIndex 61 substringToIndex 61 Suchen 706 Suchleiste 706 Swipe 615 switch-case-Struktur 85 Symbol für Schaltfläche 420 Szene 372 ausblenden 410 verlassen 379 T Tabellenzelle 503 Table View Cell 503 Tableiste 416 Tableisten-Controller 417 Tag 447 Tap 615 Target-Action-Entwurfsmuster 445, 612 718 © 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 Tastatur 338 ausblenden 341 auswählen 338 virtuelle 329 Text veröffentlichen 573 Texte verketten 50 throw 241 Timer 631 Tupel 112 Twitter 567 Typ anonymer 112 Type Inference 35, 77 typealias 637 UISwitch 471 UITableView 498, 503, 698 UITableViewCell 503, 529, 533 UITableViewController 503, 703 UITableViewDataSource 510 UITableViewDelegate 510 UITapGestureRecognizer 612 UITextField 329 UIView 577 UIViewAnimationTransition 429 UIViewController 295, 308, 417 Unicode 63 Unit-Tests 268 uppercaseString 54 V U Übergang animierter 428 Überladung 105 Uhr analoge 641 Uhrzeiger 647 Uhrzeit 631 ermitteln 635 UIActivityViewController 566 UIAlertView 347 UIApplication 424, 472 UIApplicationDelegate 403 UIButton 291 UICollectionView 553 UICollectionViewCell 553 UICollectionViewController 558 UIColor 478, 489, 493, 582 UIControl 340 UIControlState 385 UIEdgeInsets 560 UIGestureRecognizer 609 UIImageView 518, 529, 534, 562 UIKit Framework 277 UILabel 292, 307, 442 UILocalNotification 652 UINavigationController 395, 565 UINavigationItem 523 UIPanGestureRecognizer 614 UIPickerView 482, 489 UIPickerViewDataSource 484 UIPinchGestureRecognizer 619 UIRotationGestureRecognizer 624 UISearchController 706 UISlider 352, 404 UIStoryboardSegue 392 UISwipeGestureRecognizer 613 Variable 33 Variablenname 34 Variadischer Parameter 115 Vererbung 181 viewDidAppear 379 viewDidLoad 307, 379 viewWillAppear 379 Virtuelle Tastatur 329 W weak 394 Weiterleiten Informationen 566 Wertepaar 74 while-Schleife 93 Whitespace 56 Winkelfunktion 645 Wischgeste 613 Workspace-Fenster 150 Wörterbücher 73 X XCTAssertNotNil 269 XCTFail 268 Z Zahlentypen umwandeln 50, 57 Zeichenketten teilen 61 vergleichen 52 Zellen einfärben 525 Höhe 525 Zifferblatt 645 Zirkelverweis 249 Zufallszahl 284 719 © 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