Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

98
Inhalt Inhaltsverzeichnis Vorwort ................................................................................................................................................ 15 TEIL I Swift 1 Hello World! ................................................................................................................ 23 1.1 »Hello World« im Playground ........................................................................................ 23 1.2 »Hello World« als Terminal-App .................................................................................... 32 1.3 »Hello World!« auf dem iPad .......................................................................................... 40 2 Swift-Crashkurs ........................................................................................................ 43 2.1 Elementare Syntaxregeln und Kommentare ............................................................. 43 2.2 Variablen, Konstanten und Datentypen ...................................................................... 47 2.3 Strukturierung des Codes ................................................................................................ 51 2.4 Klassen und Datenstrukturen ........................................................................................ 56 2.5 Fehlerabsicherung ............................................................................................................. 58 2.6 Xcode-Crashkurs ................................................................................................................. 59 3 Operatoren ................................................................................................................... 71 3.1 Zuweisungs- und Rechenoperatoren ........................................................................... 71 3.2 Vergleichsoperatoren und logische Operatoren ....................................................... 76 3.3 Range-Operatoren ............................................................................................................. 81 3.4 Operatoren für Fortgeschrittene ................................................................................... 82 3.5 Eigene Operatoren ............................................................................................................. 86 4 Variablen und Optionals .................................................................................. 91 4.1 Variablen und Konstanten ............................................................................................... 91 4.2 Optionals .............................................................................................................................. 98 4.3 Wert- versus Referenztypen ............................................................................................ 103 5

Transcript of Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Page 1: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhalt

Inhaltsverzeichnis

Vorwort ................................................................................................................................................ 15

TEIL I Swift

1 HelloWorld! ................................................................................................................ 23

1.1 »Hello World« im Playground ........................................................................................ 23

1.2 »Hello World« als Terminal-App .................................................................................... 32

1.3 »Hello World!« auf dem iPad .......................................................................................... 40

2 Swift-Crashkurs ........................................................................................................ 43

2.1 Elementare Syntaxregeln und Kommentare ............................................................. 43

2.2 Variablen, Konstanten und Datentypen ...................................................................... 47

2.3 Strukturierung des Codes ................................................................................................ 51

2.4 Klassen und Datenstrukturen ........................................................................................ 56

2.5 Fehlerabsicherung ............................................................................................................. 58

2.6 Xcode-Crashkurs ................................................................................................................. 59

3 Operatoren ................................................................................................................... 71

3.1 Zuweisungs- und Rechenoperatoren ........................................................................... 71

3.2 Vergleichsoperatoren und logische Operatoren ....................................................... 76

3.3 Range-Operatoren ............................................................................................................. 81

3.4 Operatoren für Fortgeschrittene ................................................................................... 82

3.5 Eigene Operatoren ............................................................................................................. 86

4 Variablenund Optionals .................................................................................. 91

4.1 Variablen und Konstanten ............................................................................................... 91

4.2 Optionals .............................................................................................................................. 98

4.3 Wert- versus Referenztypen ............................................................................................ 103

5

Page 2: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

5 Verzweigungenund Schleifen .................................................................... 107

5.1 Verzweigungen mit if ....................................................................................................... 107

5.2 Inverse Logik mit guard .................................................................................................... 111

5.3 Verzweigungen mit switch ............................................................................................. 112

5.4 Versions- oder plattformabhängiger Code ................................................................. 116

5.5 Schleifen ............................................................................................................................... 117

5.6 Nicht triviale Schleifen ..................................................................................................... 122

6 Funktionenund Closures ................................................................................. 129

6.1 Funktionen definieren und ausführen ........................................................................ 129

6.2 Parameter ............................................................................................................................. 140

6.3 Standardfunktionen .......................................................................................................... 147

6.4 Funktionale Programmierung ........................................................................................ 151

6.5 Closures ................................................................................................................................. 156

7 Zahlen und geometrischeStrukturen .................................................. 167

7.1 Zahlen und boolescheWerte .......................................................................................... 168

7.2 NSNumber ............................................................................................................................ 172

7.3 CGFloat, CGPoint, CGSize und Co. ................................................................................. 173

8 Zeichenketten ............................................................................................................ 181

8.1 Syntax .................................................................................................................................... 181

8.2 Bearbeitung von Zeichenketten .................................................................................... 185

8.3 Suchen und ersetzen ......................................................................................................... 189

8.4 Zeichenketten zerlegen und zusammensetzen ........................................................ 192

8.5 Zeichenketten und Zahlen umwandeln ...................................................................... 198

9 Datumund Uhrzeit ............................................................................................... 203

9.1 Datum und Uhrzeit ermitteln und darstellen ........................................................... 203

9.2 Rechnen mit Datum und Uhrzeit .................................................................................. 205

10 Arrays, Dictionaries, Sets und Tupel ....................................................... 207

10.1 Arrays ..................................................................................................................................... 207

10.2 Arrays und Aufzählungen verarbeiten ......................................................................... 216

10.3 Dictionaries .......................................................................................................................... 225

6

Page 3: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

10.4 Sets ......................................................................................................................................... 226

10.5 Option-Sets .......................................................................................................................... 227

10.6 Tupel ....................................................................................................................................... 229

10.7 Lottosimulator .................................................................................................................... 231

11 Objektorientierte Programmierung I .................................................... 237

11.1 Klassen und Strukturen .................................................................................................... 238

11.2 Enumerationen ................................................................................................................... 247

11.3 Eigenschaften ...................................................................................................................... 251

11.4 Init- und Deinit-Funktion ................................................................................................. 263

11.5 Methoden ............................................................................................................................. 268

11.6 Subscripts ............................................................................................................................. 276

11.7 Typ-Aliasse ............................................................................................................................ 278

11.8 Speicherverwaltung .......................................................................................................... 279

12 Objektorientierte Programmierung II .................................................. 285

12.1 Vererbung ............................................................................................................................. 285

12.2 Generics ................................................................................................................................ 297

12.3 Protokolle .............................................................................................................................. 301

12.4 Standardprotokolle ............................................................................................................ 310

12.5 Extensions ............................................................................................................................ 318

12.6 Protokollerweiterungen ................................................................................................... 323

12.7 Reflection und Metatypen ............................................................................................... 328

13 Fehlerabsicherung .................................................................................................. 333

13.1 Fehlerabsicherungmit try und catch ........................................................................... 333

13.2 Selbst Fehler auslösen (throws und throw) ............................................................... 342

13.3 Fehler in Funktionen weitergeben (rethrows) ........................................................... 346

13.4 Das Error-Protokoll ............................................................................................................. 350

13.5 Fehlerabsicherung von API-Methoden (NSError) ...................................................... 351

14 Importe, Attribute und Systemfunktionen ..................................... 355

14.1 Module, Frameworks und Importe ............................................................................... 355

14.2 Attribute ............................................................................................................................... 359

14.3 Systemfunktionen aufrufen ........................................................................................... 361

7

Page 4: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

TEIL II App-Programmierung

15 Hello iOS-World! ...................................................................................................... 369

15.1 Projektstart .......................................................................................................................... 370

15.2 Gestaltung der App ........................................................................................................... 371

15.3 Steuerung der App durch Code ...................................................................................... 376

15.4 Actions und Outlets für Fortgeschrittene ................................................................... 381

15.5 Layout optimieren .............................................................................................................. 383

15.6 Textgrößemit einem Slider einstellen ......................................................................... 390

15.7 Apps auf dem eigenen iPhone/iPad ausführen ........................................................ 392

15.8 Komponenten und Dateien eines Xcode-Projekts ................................................... 394

16 iOS-Grundlagen ........................................................................................................ 397

16.1 Model-View-Controller (MVC) ........................................................................................ 397

16.2 Klassenhierarchie einer App-Ansicht ........................................................................... 402

16.3 Die UIViewController-Klasse ........................................................................................... 405

16.4 Phasen einer iOS-App ....................................................................................................... 409

16.5 Auto Layout .......................................................................................................................... 412

16.6 Steuerelemente in einer Stack-View anordnen ........................................................ 429

16.7 Texteingaben ....................................................................................................................... 433

16.8 Image-Views und Xcassets .............................................................................................. 441

17 iOS-Appsmit mehreren Ansichten .......................................................... 445

17.1 Storyboard und Controller-Klassen verbinden .......................................................... 445

17.2 Ansichten durch Segues verbinden .............................................................................. 446

17.3 Segues mit Datenübertragung ...................................................................................... 451

17.4 Navigation-Controller ....................................................................................................... 456

17.5 Tab-Bar-Controller .............................................................................................................. 461

17.6 Split-View-Controller ......................................................................................................... 468

17.7 Popups ................................................................................................................................... 478

17.8 Ja-Nein-Dialoge (UIAlertController) ............................................................................. 489

18 HellomacOS-World! ............................................................................................. 493

18.1 Von iOS zu macOS .............................................................................................................. 493

18.2 Lottozahlengenerator (Storyboard-Variante) ............................................................ 496

8

Page 5: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

18.3 Lottozahlengenerator (XIB/AppDelegate-Variante) ................................................ 505

18.4 Lottozahlengenerator (XIB/WindowController-Variante) ..................................... 511

18.5 Lottozahlengenerator (XIB/ViewController-Variante) ............................................ 515

19 macOS-Grundlagen .............................................................................................. 519

19.1 Programmemit mehreren Fenstern ............................................................................. 519

19.2 Tab-View-Controller ........................................................................................................... 527

19.3 Standarddialoge ................................................................................................................. 535

19.4 Maus ...................................................................................................................................... 539

19.5 Tastatur ................................................................................................................................. 547

19.6 Menüs .................................................................................................................................... 553

19.7 Programme ohneMenü ................................................................................................... 561

19.8 Drag&Drop ......................................................................................................................... 564

20 tvOS .................................................................................................................................... 579

20.1 Hello tvOS! ........................................................................................................................... 580

20.2 Fernbedienung auswerten .............................................................................................. 586

20.3 Focus Engine ........................................................................................................................ 592

TEIL III Programmier- und Arbeitstechniken

21 Dateien undUser-Defaults ............................................................................ 603

21.1 User-Defaults ...................................................................................................................... 603

21.2 Dateinamen und URLs ...................................................................................................... 608

21.3 Bundle-Dateien und Xcassets-Bilder ............................................................................ 610

21.4 Standardverzeichnisse ...................................................................................................... 612

21.5 Dateioperationen ............................................................................................................... 617

21.6 Wie geht’s weiter? ............................................................................................................. 625

22 Netzwerk, XML und JSON ............................................................................... 627

22.1 Dateien per HTTP/HTTPS laden ..................................................................................... 627

22.2 XML-Dokumente auswerten .......................................................................................... 636

22.3 JSON-Dokumente auswerten ......................................................................................... 640

22.4 Webseiten anzeigen .......................................................................................................... 644

9

Page 6: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

23 Tabellenund Listen darstellen .................................................................... 651

23.1 Listen in iOS-Apps (UITableView) .................................................................................. 651

23.2 Prototypzellen ..................................................................................................................... 657

23.3 Individuelle Gestaltung von Listenzellen .................................................................... 663

23.4 Veränderliche Listen .......................................................................................................... 669

23.5 Tabellen in macOS-Apps (NSTableView) ..................................................................... 671

23.6 Collections asynchron füllen (UICollectionView) ..................................................... 682

24 GPS- und Kompassfunktionen .................................................................... 691

24.1 Hello MapView! .................................................................................................................. 691

24.2 Wegstrecke aufzeichnen .................................................................................................. 696

24.3 Kompassfunktionen .......................................................................................................... 703

25 Grafik und Animation ......................................................................................... 707

25.1 Eigene Steuerelementemit Grafikfunktionen .......................................................... 708

25.2 Kompass-Steuerelement ................................................................................................. 714

25.3 Core Graphics ...................................................................................................................... 722

25.4 Animationen ........................................................................................................................ 725

26 Audio, Video und Fotos ..................................................................................... 731

26.1 Audio-Wiedergabe mit dem AVAudioPlayer .............................................................. 731

26.2 Audio-Wiedergabe mit dem AVPlayer ......................................................................... 740

26.3 Audio-Wiedergabe mit dem AVPlayerViewController ............................................ 742

26.4 Audio-Aufnahmenmit dem AVAudioRecorder durchführen ............................... 744

26.5 Videos abspielen ................................................................................................................. 749

26.6 Videos mit der Picker-View auswählen und aufnehmen ....................................... 753

26.7 YouTube-Videos abspielen ............................................................................................... 758

26.8 Fotos mit der Picker-View auswählen und aufnehmen .......................................... 761

26.9 Fotos in einer AVCaptureSession aufnehmen ........................................................... 763

26.10 Barcodes in einer AVCaptureSession erkennen ........................................................ 772

27 SpriteKit .......................................................................................................................... 777

27.1 Hello SpriteKit! .................................................................................................................... 778

27.2 Sprites erzeugen und bewegen ..................................................................................... 786

10

Page 7: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

27.3 Spielsteuerung durch Touch-Ereignisse ...................................................................... 792

27.4 Bewegungssteuerung (Gyroskop und Accelerometer) ........................................... 798

27.5 Aktionen ................................................................................................................................ 804

27.6 Der Game-Loop ................................................................................................................... 811

27.7 Kollisionserkennung .......................................................................................................... 813

27.8 Minispiel: Luftballone abschießen ............................................................................... 819

27.9 Physik ..................................................................................................................................... 826

27.10 Minispiel: Pyramide zerstören ....................................................................................... 832

27.11 Scene-Editor ......................................................................................................................... 838

27.12 Partikel-Emitter .................................................................................................................. 845

28 AsynchroneProgrammierung ..................................................................... 849

28.1 Hello Grand Central Dispatch! ....................................................................................... 850

28.2 GCD-Grundlagen ................................................................................................................ 853

28.3 Parallel rechnen .................................................................................................................. 858

28.4 Die Async-Bibliothek ......................................................................................................... 865

29 App Store und Co. ................................................................................................... 867

29.1 iOS-Artwork (Icons, Launch Screen) .............................................................................. 868

29.2 macOS-Artwork (Icon) ...................................................................................................... 869

29.3 tvOS-Artwork (Parallax-Icons, Launch und Top Shelf Image) ................................ 870

29.4 Mehrsprachige Apps ......................................................................................................... 877

29.5 Eigene Apps im App Store anbieten ............................................................................. 886

29.6 macOS-Programme selbst weitergeben ..................................................................... 895

30 Xcode-Arbeitstechniken ................................................................................... 901

30.1 Simulator-Ausgaben stoppen ........................................................................................ 901

30.2 Header-Code einer eigenen Klasse erzeugen ............................................................ 902

30.3 Versionsverwaltungmit Git ............................................................................................ 903

30.4 Crashlogs .............................................................................................................................. 906

30.5 Projekte umbenennen ...................................................................................................... 906

30.6 Xcode-Verzeichnisse aufräumen ................................................................................... 907

11

Page 8: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

TEIL IV Beispielprojekte

31 New-York-Times-Bestseller ............................................................................. 913

31.1 New-York-Times-API .......................................................................................................... 915

31.2 Benutzeroberfläche ........................................................................................................... 918

31.3 Split-View-Variante ............................................................................................................ 924

32 To-do-Listen ................................................................................................................. 929

32.1 Gestaltung der Benutzeroberfläche ............................................................................. 930

32.2 Datenmodell ........................................................................................................................ 931

32.3 View-Controller-Klasse ..................................................................................................... 932

32.4 Popup-View-Controller-Klasse ....................................................................................... 939

33 Schatzsuche ................................................................................................................. 941

33.1 Aufbau der App ................................................................................................................... 941

33.2 Datenmodell ........................................................................................................................ 946

33.3 LocationManager selbst gemacht ................................................................................ 948

33.4 Steuerelement zur Richtungsanzeige (UIBezierPath) ............................................. 953

33.5 Hauptansicht mit Listenfeld ........................................................................................... 954

33.6 Popup-Dialog zum Speichern ......................................................................................... 959

33.7 Detailansicht mit Richtungspfeil ................................................................................... 960

34 Währungskalkulator ............................................................................................ 969

34.1 App-Überblick ..................................................................................................................... 969

34.2 Kurse ermitteln ................................................................................................................... 977

34.3 Das Datenmodell der App ............................................................................................... 980

34.4 Umrechnungsansicht ........................................................................................................ 983

34.5 Einstellungsansicht ........................................................................................................... 990

34.6 Internationalisierung und Lokalisierung ..................................................................... 995

35 Fünf Gewinnt .............................................................................................................. 997

35.1 Die App »Fünf Gewinnt« .................................................................................................. 997

35.2 Enumerationen und globale Funktionen (Globals.swift) ....................................... 1000

12

Page 9: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

35.3 Die Spiellogik (FiveWins.swift) ....................................................................................... 1004

35.4 Darstellung des Spielbretts und der Steine (BoardView.swift) ............................ 1015

35.5 Steuerung des Spielablaufs (ViewController.swift) ................................................. 1025

35.6 Der Popup-Dialog (PopupVC.swift) ............................................................................... 1031

35.7 Erweiterungsmöglichkeiten ........................................................................................... 1033

36 Icon-Resizer .................................................................................................................. 1037

36.1 App-Überblick ..................................................................................................................... 1037

36.2 Icons verwalten (IconSize-Struktur) .............................................................................. 1042

36.3 Hauptfenster (ViewController.swift) ............................................................................ 1049

36.4 Drag&Drop-Quelle für Icons (IconCellView.swift) .................................................. 1057

36.5 Drag&Drop-Empfänger für Icons (OriginalIconView.swift) ................................. 1058

36.6 Popup-Menü (IconChoiceVC.swift) ............................................................................... 1061

36.7 Temporäres Verzeichnis erstellen und löschen ......................................................... 1062

37 Breakout ......................................................................................................................... 1065

37.1 Programmaufbau ............................................................................................................... 1066

37.2 Initialisierung ...................................................................................................................... 1067

37.3 Spielsteuerung .................................................................................................................... 1073

38 Pac-Man selbst gemacht .................................................................................. 1077

38.1 Programmaufbau ............................................................................................................... 1078

38.2 Der Tile-Editor »Tiled« ....................................................................................................... 1080

38.3 Globale Konstanten, Datenstrukturen und Enumerationen ................................ 1085

38.4 Initialisierung des Spiels .................................................................................................. 1087

38.5 Die Maze-Klasse ................................................................................................................. 1090

38.6 Aufbau der Spielszene (setup-Methoden) .................................................................. 1094

38.7 Spielsteuerung (touch-Methoden) ............................................................................... 1101

38.8 Bewegung des Pac-Mans ................................................................................................. 1106

38.9 Steuerung der Monster .................................................................................................... 1110

38.10 Kollisionen ............................................................................................................................ 1116

38.11 Apple-TV-Variante von Pac-Man .................................................................................... 1120

38.12 Pac-Man-Figuren zeichnen .............................................................................................. 1124

13

Page 10: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Inhaltsverzeichnis

39 Asteroids ......................................................................................................................... 1127

39.1 Programmaufbau ............................................................................................................... 1128

39.2 Globale Konstanten und Funktionen ........................................................................... 1130

39.3 Programmstart und Tastaturereignisse (GameViewController) .......................... 1130

39.4 Initialisierung des Spiels (GameScene) ........................................................................ 1134

39.5 Spielablauf (ebenfalls in GameScene) ......................................................................... 1140

39.6 FokussierbareMenütexte (MyLabel) ............................................................................ 1146

39.7 Der Einstellungsdialog (MainScene) ............................................................................ 1147

Index ..................................................................................................................................................... 1153

14

Page 11: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Vorwort

Vorwort

Apples größte Innovation des Jahres 2014 war ausmeiner Sicht weder die Vorstellung

der AppleWatch noch die Auslieferung des Bestsellers iPhone 6. Apple hat sich neben

den Arbeiten an diesen Produkten einer anderen Baustelle zugewandt und als Reak-

tion auf die vielenMängel, die die rund 20 Jahre alte ProgrammierspracheObjective-C

aufweist, eine vollkommen neue Programmiersprache entwickelt: Swift!

In ersten Kommentaren konnten selbst Apple-Fans ihre Skepsis nicht verbergen:

Brauchen wir wirklich eine neue Programmiersprache? Doch je mehr Details Apple

auf der World Wide Developers Conference (WWDC 2014) verriet, desto größer wurde

die Begeisterung der teilnehmenden Entwickler und der Fachpresse.

Warum Swift?

Swift ist für Apple ein Befreiungsschlag: Objective-C dient demApple-Universum seit

vielen Jahren als Fundament. Das ändert aber nichts daran, dass Objective-C eine Pro-

grammiersprache aus den 1980er-Jahren ist, die in keinerlei Hinsicht mit modernen

Programmiersprachenmithalten kann.

Swift ist dagegen ein sauberer Neuanfang. Bei der Vorstellung wurde Swift auch

Objective-C without the C genannt. Natürlich ist Swift von Objective-C beeinflusst –

schließlich muss Swift kompatibel zu den unzähligen Apple-Bibliotheken sein. Swift

realisiert viele neue Ideen, greift aber auch Konzepte von C#, Haskell, Java, Python

und anderen Programmiersprachen auf. Daraus ergeben sichmehrere Vorteile:

Swift zählt zu denmodernsten Programmiersprachen, die es momentan gibt.

Code lässt sich in Swift syntaktisch eleganter formulieren als in Objective-C.

Der resultierende Code ist besser lesbar und wartbar.

Swift ist für Programmierer, die schon Erfahrungmit anderenmodernen Sprachen

gesammelt haben, wesentlich leichter zu erlernen als Objective-C. Vorhandenes

Know-how lässt sich einfacher auf Swift als auf Objective-C übertragen.

Seit Ende 2015 ist Swift ein Open-Source-Produkt. Swift steht seither auch für Linux

zur Verfügung, und der Entwicklungsprozess erfolgt offen und transparent.

Wer mit Apple-Produkten zu tun hat, erwartet Perfektion bis ins kleinste Detail. Bei

aller Euphorie für Swift will ich Ihnen nicht verschweigen, dass dies für Swift auch in

Version 3 nicht vollständig zutrifft:

15

Page 12: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Vorwort

Die Integration in Xcode ist gut, aber es ist noch Luft nach oben. Beispielsweise

fehlen in Xcode Refactoring-Funktionen für Swift.

Das Swift-Entwicklerteam versucht, Swift zur optimalen Programmiersprache zu

machen. Das geht nicht von heute auf morgen. Es ist absehbar, dass Swift sich in

den nächsten Jahren weiterentwickeln wird. Das ist gut so, aber es führt dazu, dass

Sie jeden Herbst Ihren Code an die dann gerade neueste Swift-Version anpassen

müssen. Diemeiste Arbeit erledigt der in Xcode integrierte Konverter automatisch.

Aber dennoch wäremehr Stabilität natürlich angenehmer.

Allen Kinderkrankheiten zumTrotz vereinfacht Swift den Einstieg in die App-Entwick-

lung enorm. Es ist offensichtlich, dass Swift in wenigen Jahren die Programmierspra-

che der Apple-Welt sein wird und Objective-C in dieser Rolle ablöst. In naher Zukunft

führt an Swift kein Weg vorbei, wenn Sie native Apps für iOS, macOS oder andere

Apple-Plattformen entwickelnmöchten.

Der Swift-Entwicklungsprozess

Seit Herbst 2015 ist Swift ein Open-Source-Projekt. DieWeiterentwicklung erfolgt voll-

kommen transparent. Jede neue Idee wird als Proposal veröffentlicht, mit ihren Vor-

undNachteilendiskutiert und kommt schließlich zu einer Abstimmung. Nichtsdesto-

trotz wird beimNachlesen derMailing-Archive schnell klar, dass die Entwicklung von

Swift trotz des öffentlichen Charakters sehr stark von Apple-Mitarbeitern gesteuert

wird.

Ich befasse mich in diesem Buch selten mit der Frage, warum Swift so ist, wie es ist,

sondern beschreibe es in der gerade aktuellen Form. Aber wenn Sie Interesse an den

Hintergründen haben und mitverfolgen möchten, wie Swift sich entwickelt, lege ich

Ihnen das Studium der folgenden Seiten nahe:

https://github.com/apple/swift-evolution

https://lists.swift.org/pipermail/swift-evolution

http://ericasadun.com

Neu in Swift 3

Im Vergleich zu Swift 2 wurden in Version 3 rund hundert Veränderungen durch-

geführt. Zu jeder dieser Veränderungen gibt es einen ausführlichen Vorschlag. Die

Abschaffung der Operatoren ++ und -- ist beispielsweise im Proposal 0004 dokumen-

tiert. Links zu diesem und allen anderen Proposals finden Sie auf folgender Seite:

https://apple.github.io/swift-evolution

Es ist hier nicht zielführend, alle Änderungen aufzuzählen. Wenn Sie neu in Swift

einsteigen, ist es ohnedies irrelevant, wie Swift in früheren Versionen ausgesehen

16

Page 13: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Vorwort

hat. Und wenn Sie bisher in Swift 2 programmiert haben, kümmert sich der Code-

Konverter von Xcode um den Großteil der erforderlichen Änderungen.

Aus meiner Sicht hat sich Swift 3 in den folgenden Punkten radikal verbessert:

Bibliotheken:Die Standardbibliotheken sind wesentlich Swift-kompatibler gewor-

den. Viele Methoden, die ursprünglich für Objective-C entwickelt wurden, stehen

nun in einer zweiten, Swift-tauglicheren und besser lesbaren Version zur Verfü-

gung. Hier sehen Sie einige Beispiele, die Code aus Swift 2 aktuellem Swift-3-Code

gegenüberstellen:

NSUserDefaults .standardUserDefaults () -->

UserDefaults .standard

zeichenkette .rangeOfString ("such mich") -->

zeichenkette .range(of: "such mich")

func prepareForSegue (segue: UIStoryboardSegue ,

sender : AnyObject ?) -->

func prepare (for segue: UIStoryboardSegue , sender : Any?)

let dest = segue.destinationViewController -->

let dest = segue.destination

txt.stringByTrimmingCharactersInSet (

NSCharacterSet .whitespaceAndNewlineCharacterSet ()) -->

txt.trimmingCharacters (in: .whitespacesAndNewlines )

Parameter von Methoden: In Swift 2 wurde der erste Parameter einer Funktion

oder Methode anders behandelt als alle weiteren Parameter. In Swift 3 gelten für

alle Parameter dieselben Regeln. Da kannman nur fragen: Warum nicht gleich so?

Literale für Farben und Bitmaps: Farben und Bitmaps aus Xcassets-Dateien kön-

nen imCode als Literale eingebaut werden. Diese Literale zeigen die Farbe bzw. eine

winzige Vorschau der Bitmap. In diesem Buch lässt sich das schwer abbilden, aber

in der Praxis ist das ein ausgesprochen hilfreiches Feature.

Generics-Verbesserungen: Beim Umgang mit generischen Typen gab es viele Ver-

besserungen. Unter anderem können Sie nun generische Aliasse definieren (z. B.

typealias StringDictionary<T> = Dictionary<String, T>).

Daneben gibt es viele Detailveränderungen, die aus einem Apple-typischen Perfek-

tionsanspruch resultieren. Sie sind spannend für Entwickler von (Standard-)Biblio-

theken, aber für den typischen App-Entwickler nur begrenzt relevant.

17

Page 14: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Vorwort

Keine Angst vor Swift 4!

Es ist schon ein wenig absurd: Im August 2016, also rund drei Monate, bevor die-

ses Buch veröffentlicht wurde, begannen bereits die Planungen und erste Arbeiten

an Swift 4. Zu den wichtigsten Zielen zählt eine Optimierung der generischen Funk-

tionen. Daneben sollen der Umgang mit Zeichenketten und die Speicherverwaltung

verbessert werden. Soweit es der enge Zeitplan zulässt, wird es auch kleinere Sprach-

erweiterungen und fortgesetzte Swift-Anpassungen der Standardbibliotheken geben.

Schließlich sollen der Compiler und andere Werkzeuge so gestaltet werden, dass mit

Swift 3 entwickelte Bibliotheken unverändert unter Swift 4 weiterverwendet werden

können. Derart große Umstellungen wie in Swift 3 sollen diesmal aber vermieden

werden.

Müssen Sie sich also vor den zu erwartenden Änderungen in Swift 4 fürchten? Ist es

zweckmäßig, mit dem Swift-Einstieg auf die nächste Version zu warten? Nein! Bereits

der Umstieg von Swift 2 auf Swift 3 hat gezeigt, dass der in Xcode integrierte Code-

Konverter einen Großteil aller Änderungen automatisch erledigt.

Außerdem hat sich bei meiner Arbeit an den beiden Auflagen dieses Buchs eines

herauskristallisiert: Bei der App-Programmierung kostet nicht der Umgangmit Swift

an sich Zeit, sonderndie Suchenachdengeeigneten Klassen,Methodenund Program-

miertechniken.

Sobald Sie Swift einmal in Grundzügen verstanden haben, werden Sie die meiste Zeit

dafür investieren, die Dokumentation von Bibliotheken zu studieren bzw. neue Klas-

sen auszuprobieren. Der Kosmos der Apple-Bibliotheken ist derart riesig, dass ich in

diesem Buch nicht einmal ansatzweise einen Überblick geben kann. Kurzum: Nicht

Swift ist das Problem, sondern die Unmenge an Bibliotheken und Klassen, in die Sie

sich einlesenmüssen.

Was bietet dieses Buch?

Dieses Buch vermittelt einen kompakten Einstieg in die Programmiersprache Swift

in der Version 3 (Xcode 8). Das Buch ist in vier Teile gegliedert:

Teil I führt in die Grundlagen von Swift ein. Hier lernen Sie alle wichtigen Sprach-

details kennen. Die Themenpalette reicht vom Umgang mit Variablen und ele-

mentaren Datentypen bis hin zur Syntax der objekt- und protokollorientierten

Programmierung.

Teil II ist eine Einführung in die Entwicklung von Apps für iOS, macOS und tvOS.

Hier erkläre ich Ihnen beispielsweise, wie der Storyboard-Editor funktioniert, wie

Sie Ihre Oberfläche mit eigenem Swift-Code verbinden, eigene ViewController-

Klassen entwickeln, Tastaturereignisse auswerten oder wie Sie Apps mit mehreren

Dialogen/Views organisieren.

18

Page 15: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Vorwort

Teil III fasst wichtige Programmiertechniken in Bausteinform zusammen. In Kurz-

anleitungen zeige ich Ihnen unter anderem, wie Sie auf Dateien zugreifen, XML-

Dokumente auswerten, Webseiten anzeigen, Steuerelemente mit eigener Grafik

gestalten, Listen und Tabellen in Apps darstellen, geografische Daten auswerten

und Spiele mit SpriteKit programmieren. Sobald Ihre App mit diesen Techni-

ken zufriedenstellend funktioniert, lernen Sie, wie Sie sie tauglich für den App

Store machen und dort einreichen. Der Großteil der hier präsentierten Techniken

funktioniert plattformübergreifend, also gleichermaßen in iOS-, tvOS- undmacOS-

Apps.

Teil IV zeigt anhand konkreter Beispielprojekte die Praxis der App-Programmie-

rung. Die Apps decken eine ganze Palette von Themen ab: vom praktischen

Währungsumrechner über den Icon-Resizer bis hin zumehreren Spielen.

Selbstverständlich können Sie alle Beispieldateien und -projekte dieses Buchs herun-

terladen. Einen Download-Link finden Sie hier:

www.rheinwerk-verlag.de/swift_4115

Um von diesem Buch maximal zu profitieren, benötigen Sie weder Vorkenntnisse in

Xcode noch in der App-Entwicklung. Ich setze aber voraus, dass Sie bereits Erfahrun-

gen mit einer beliebigen Programmiersprache gesammelt haben. Ich erkläre Ihnen

in diesem Buch also, wie Sie in Swift mit Variablen umgehen, Schleifen programmie-

ren und Klassen entwickeln, aber nicht, was Variablen sind, wozu Schleifen dienen

und warumKlassen das Fundament der objektorientierten Programmierung sind. So

kann ich Swift kompakt und ohne viel Overhead beschreiben und den Schwerpunkt

auf die konkrete Anwendung legen.

Leseanleitung

Fast 1200 Seiten – das kann schon abschrecken! Dazu besteht aber kein Grund. Ich

habe mich beim Schreiben dieses Buchs bemüht, den Inhalt auf möglichst eigen-

ständige Kapitel zu verteilen, aus denen Sie sich wie aus einem Baukasten bedienen

können.

Wenn Swift für Sie vollständig neu ist, dann ist die Lektüre der ersten Kapitel aus

Teil I natürlich unumgänglich. Besonders wichtig ist, dass Sie die Swift-spezifischen

Eigenheiten beim Umgang mit elementaren Datentypen und Aufzählungen (Arrays,

Dictionaries etc.) kennenlernen und das Konzept von Optionals verstehen. Interes-

santerweise hat sich herausgestellt, dass Sie für die Entwicklung erster Apps nicht

unbedingt alle Feinheiten imZusammenhangmit Vererbung, Protokollen etc. wissen

müssen. Die Basics reichen zumeist.

19

Page 16: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Vorwort

Teil II richtet sich speziell an Programmierer, die erstmalig Apps für iOS, macOS oder

watchOS entwickeln. Wenn Sie bisher Objective-C zur App-Programmierung verwen-

det haben, werden Sie in Teil II auf viel bekanntes Wissen stoßen.

Bei Teil III habe ich versucht, oft benötigte Programmiertechniken möglichst losge-

löst von der Zielplattform zu beschreiben. Beispielsweise erfolgt der Umgang mit

Dateien unter iOS ganz ähnlich wie unter macOS. Aus den Kapiteln in Teil III können

Sie sich also bedienen, wie Sie es gerade brauchen.

Viele Detailprobleme treten erst dann auf, wennman den Schritt von kleinen Beispie-

len hin zu »richtigen« Apps macht. Deswegen stellt Teil IV eine Reihe vollständiger

Projekte vor. Auchwenn es unwahrscheinlich ist, dass Sie genau so eine App program-

mieren möchten wie eines der Beispiele aus Teil IV, so werden Sie in diesen Kapiteln

vermutlich doch inhaltlich verwandte Anleitungen und Arbeitstechniken mit einem

hohen Praxisbezug finden. Probieren Sie die Apps einfach einmal aus, und blättern

Sie dann durch die entsprechenden Kapitel – Sie werden sicher über Details stolpern,

die sich später als hilfreich herausstellen werden.

Viel Spaß bei der App-Entwicklung!

Eine neue Programmiersprache zu erlernen ist immer eine Herausforderung. Noch

schwieriger ist es, einen Überblick über die schier unüberschaubare Fülle von Biblio-

theken zu gewinnen, die Sie zur App-Entwicklung brauchen. Dieses Buch soll Ihnen

bei beiden Aspekten helfen und Ihnen ein solides Fundament vermitteln.

Wenn Sie in dieApp-Programmierungmit Swift einsteigen, haben Sie das Privileg,mit

einer dermodernsten aktuell verfügbaren Programmiersprachenarbeiten zu können.

Sobald Sie die ersten Schritte einmal erfolgreich absolviert haben, wird die Faszina-

tion für diese Sprache auch Sie erfassen. Bei Ihrer Reise durch die neue Welt der

Swift-Programmierung wünsche ich Ihnen viel Spaß und Erfolg!

Michael Kofler (https://kofler.info)

PS: Ausdrücklich bedankenmöchte ichmich bei Alfred Schilken, der eine Rohfassung

desManuskript gelesen undmich auf viele Ungenauigkeiten hingewiesen hat.

20

Page 17: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Kapitel 3

Operatoren

ImAusdruck a = b + c gelten die Zeichen = und + als Operatoren. Dieses Kapitel stellt

Ihnen alle Swift-Operatoren vor – von den simplen Operatoren für die Grundrechen-

arten bis hin zu Swift-Spezialitäten wie dem Range-Operator n1...n2.

Leerzeichen vor oder nach Operatoren

Normalerweise ist es nicht notwendig, vor oder nach einemOperator ein Leerzeichen

zu schreiben. x=x+7 funktioniert genauso gut wie x = x + 7. Aber wie so oft bestä-

tigen Ausnahmen die Regel: Swift kennt bereits standardmäßig ungewöhnlich viele

Operatoren, und wenige Zeilen Code reichen aus, um weitere zu definieren.

Das führt mitunter dazu, dass der Compiler nicht eindeutig erkennen kann, wo der

eine Operator endet und wo der nächste beginnt. Spätestens dann müssen Sie ein

Leerzeichen setzen – und dann sollten Sie es vor und nach dem Operator setzen!

Andernfalls glaubt der Compiler nämlich, Sie wollten ihn explizit darauf hinweisen,

dass es sich um einen Präfix- oder Postfix-Operator handelt. Im Detail sind diese Fein-

heiten in »The Swift Programming Language« dokumentiert:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/

Swift_Programming_Language/LexicalStructure.html (beim Punkt »Operators«)

Wie rasch Probleme auftreten können, zeigt der Vergleich eines Optionals mit nil:

Der Compiler betrachtet if opt!=nil als Syntaxfehler, weil er die Anweisung als

if opt! = nil interpretiert, also als Kombination zweier Operatoren. Korrekt müs-

sen Sie den Vergleich in der Form if opt != nil formulieren.

3.1 Zuweisungs- und Rechenoperatoren

Dieser Abschnitt erläutert die zahlreichen Rechen- und Zuweisungsoperatoren. Swift

kennt dabei auchMischformen. Beispielsweise entspricht x+=3 der Anweisung x=x+3.

71

Page 18: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

Einfache Zuweisung

Der Zuweisungsoperator = speichert in einer Variablen oder Konstanten das Ergebnis

des Ausdrucks:

variable = ausdruck

Vor der ersten Zuweisung an eine Variable bzw. Konstantemuss diesemit var bzw. let

als solche deklariert werden:

var i = 17

i = i * 2

let pi = 3.1415927

Nicht zulässig sind Mehrfachzuweisungen in der Art a=b=3. Dafür können mehrere

Variablen als Tupel geschrieben und gleichzeitig verändert werden:

var (a, b, c) = (1, 7, 12)

Das funktioniert auch bei komplexeren Ausdrücken:

var (_, a, (b, c)) = (1, 2, ("x" , "y"))

// entspricht var a=2; var b="x"; var c="y"

Der Unterstrich _ ist hier ein Wildcard Pattern. Es trifft auf jeden Ausdruck zu und

verhindert im obigen Beispiel dessen weitere Verarbeitung.

Wert- versus Referenztypen

Swift unterscheidet bei Zuweisungen zwischen zwei grundlegenden Datentypen:

Werttypen (Value Types): Dazu zählen Zahlen, Zeichenketten, Tupel, Arrays, Dic-

tionaries sowie struct- und enum-Daten. Bei einer Zuweisung werden die Daten

kopiert. Die ursprünglichen Daten und die Kopie sind vollkommen unabhängig

voneinander.

Referenztypen:Objekte, also Instanzen von Klassen, sind Referenztypen. Bei einer

Zuweisung wird eine weitere Referenz auf die bereits vorhandenen Daten erstellt.

Es zeigen nun zwei (odermehr) Variablen auf dieselben Daten.

Die folgenden beiden Beispiele verdeutlichen den Unterschied. Im ersten Beispiel

werden in x und y ganze Zahlen gespeichert, alsoWerttypen:

var x = 3

var y = x

x=4

print(y) // y ist unver ändert 3

Für das zweite Beispiel definieren wir zuerst die Mini-Klasse SimpleClass. In a wird

eine Instanz dieser Klasse gespeichert. Bei der Zuweisung b = awird die Instanz nicht

72

Page 19: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.1 Zuweisungs- und Rechenoperatoren

kopiert, stattdessen verweist nun b auf dasselbe Objekt wie a. (In C würde man sagen,

a und b sind Zeiger.) Jede Veränderung des Objekts betrifft deswegen a gleichermaßen

wie b:

class SimpleClass {

var data=0

}

var a = SimpleClass ()

var b = a // a und b zeigen auf die gleichen Daten

a.data = 17

print(b.data) // deswegen ist auch b.data 17

Arrays, Dictionaries und Zeichenketten sind Werttypen!

Die Unterscheidung zwischen Wert- und Referenztypen gibt es bei den meisten

Programmiersprachen. Beachten Sie aber, dass Arrays und Zeichenketten in Swift

Werttypen sind und nicht, wie in vielen anderen Sprachen, Referenztypen!

Elementare Rechenoperatoren

Die meisten Rechenoperatoren sind aus dem täglichen Leben bekannt (siehe

Tabelle 3.1). Der Operator % liefert den Rest einer ganzzahligen Division: 13 % 5 ergibt

also 3, da 2 * 5 + 3 = 13. Bei Fließkommazahlen wird der Rest zum ganzzahligen

Ergebnis ermittelt. 1.0 % 0.4 ergibt 0.2, da 2 * 0.4 + 0.2 = 1.0 ist.

Operator Bedeutung

+ Addition

- Subtraktion

* Multiplikation

/ Division

% Restwert einer ganzzahligen Division

&+ Integer-Addition ohne Überlaufkontrolle

&- Integer-Subtraktion ohne Überlaufkontrolle

&* Integer-Multiplikation ohne Überlaufkontrolle

Tabelle 3.1 Rechenoperatoren

73

Page 20: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

Alle Operatoren setzen voraus, dass links und rechts von ihnen jeweils gleichar-

tige Datentypen verwendet werden! ImGegensatz zu anderen Programmiersprachen

erfolgen Typumwandlungen nicht automatisch.

var a = 3 // a ist eine Integer -Variable

var b = 1.7 // b ist eine Fließkommavariable

var c = a + b // Fehler , Int -Wert + Double -Wert nicht zulässig

Wenn Sie die Summe von a plus b ausrechnen möchten, müssen Sie explizit den

Datentyp einer der beidenOperatoren anpassen. Int rundet dabei immer ab, d. h., aus

1.7 wird 1.

var c1 = a + Int(b) // c1 = 4

var c2 = Double (a) + b // c2 = 4.7

Division durch null

Bei einer Fließkommadivision durch 0.0 lautet das Ergebnis einfach Double.infinity

bzw. -Double.infinity. Wenn Sie hingegenmit Integerzahlen arbeiten, löst eine Divi-

sion durch 0 einen Fehler aus.

Eine Besonderheit von Swift sind die Operatoren &+, &- und &*: Sie führen die Grund-

rechenarten für Integerzahlen ohne Überlaufkontrolle durch. Das ermöglicht die

Programmierung besonders effizienter Algorithmen. Sollte allerdings doch ein Über-

lauf eintreten, dann ist das Ergebnis falsch!

var i = 10000000 // Integer

var result = i &* i &* i // falsches Ergebnis

// 3.875.820.019.684.212.736

Swift kennt keinenOperator zumPotenzieren. abmüssen Sie unter Zuhilfenahme der

Funktion pow berechnen. Diese Funktion ist in der Foundation-Bibliothek definiert. Sie

steht nur zur Verfügung, wenn Ihr Code import Foundation enthält oder eine andere

Bibliothek importiert, die auf die Foundation zurückgreift. Das trifft unter anderem

für Cocoa und UIKit zu.

var e = 7.0

var f = pow(e, 3.0) // 7 * 7 * 7 = 343.0

Zeichenketten aneinanderfügen

Der Operator + addiert nicht nur zwei Zahlen, sondern fügt auch Zeichenketten an-

einander:

74

Page 21: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.1 Zuweisungs- und Rechenoperatoren

var s1 = "Hello"

var s2 = "World!"

var hw = s1 + " " + s2 // "Hello World!"

Inkrement und Dekrement

Wie viele andere Programmiersprachen kannte Swift bis zur Version 2 die Inkrement-

und Dekrement-Operatoren ++ und --. In Swift 3 wurden diese Operatoren allerdings

eliminiert, mit der Begründung, dass die Unterscheidung zwischen der Postfix- und

der Präfix-Notation, also zwischen i++ und ++i, zu viel Verwirrung und oft fehlerhafte

Algorithmen verursacht.

Wenn Sie in Swift 3 eine Variable um eins vergrößern oder verkleinernmöchten,müs-

sen Sie dies in der Form i=i+1 oder in der Kurzschreibweise i+=1machen.

var i=3

i++ // Fehler , steht in Swift 3 nicht mehr zur Verfügung

i+=1 // OK

Inkrement- und Dekrement-Operatoren selbst gemacht

Wenn Sie auf die Inkrement- und Dekrement-Operatoren nicht verzichten möchten,

bietet Swift die Möglichkeit, diese Operatoren relativ unkompliziert wieder selbst zu

definieren. Fertigen Code für alle Integer-Datentypen inklusive Int8, Int16, Int32 und

Int64 sowie alle UInt-Varianten finden Sie z. B. hier auf Github:

https://gist.github.com/erica/6b4be87de789f32b8926388c6c6e75e9

Rechnen mit Bits

Die bitweisen Operatoren &, |, ^ und ~ (AND, OR, XOR und NOT) verarbeiten ganze

Zahlen bitweise. Das folgende Beispiel verwendet die Schreibweise 0b zur Kennzeich-

nung binärer Zahlen. String mit dem zusätzlichen Parameter radix:2 wandelt ganze

Zahlen in eine Zeichenkette in binärer Darstellung um.

let a = 0b11100 // Wert 28

let b = 0b01111 // Wert 15

let result = a & b // Wert 12

print(String (result , radix:2)) // Ausgabe 1100

>> verschiebt die Bits einer Zahl umnBits nach rechts (entspricht einerDivisiondurch

2n), << verschiebt entsprechend nach links (entspricht einer Multiplikation mit 2n).

>>> funktioniert wie >>, betrachtet die Zahl aber so, als wäre sie vorzeichenlos.

75

Page 22: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

let e = 16

let f = e << 2 // entspricht f=e*4, Ergebnis 64

let g = e >> 1 // entspricht g=e/2, Ergebnis 8

Wenn Sie Daten bitweise verarbeiten, ist es oft zweckmäßig, anstelle gewöhnlicher

Integer-Zahlen explizit Datentypen ohne Vorzeichen zu verwenden, z. B. UInt32 oder

UInt16. Das folgende Beispiel verwendet 0x zur Kennzeichnung hexadezimaler Zah-

len.

let rgb: UInt32 = 0x336688

let red: UInt8 = UInt8( (rgb & 0xff0000 ) >> 16 )

Kombinierte Rechen- und Zuweisungsoperationen

Alle bereits erwähnten Rechenoperatoren sowie die logischen Operatoren && und ||

können mit einer Zuweisung kombiniert werden. Dazu muss dem Operator das Zei-

chen = folgen. Details zu den logischen Operatoren folgen im nächsten Abschnitt.

x += y // entspricht x = x + y

x -= y // entspricht x = x - y

x *= y // entspricht x = x * y

x /= y // entspricht x = x / y

x %= y // entspricht x = x % y

x <<= y // entspricht x = x << y

x >>= y // entspricht x = x >> y

x &= y // entspricht x = x & y

x &&= y // entspricht x = x && y

x |= y // entspricht x = x | y

x ||= y // entspricht x = x || y

x ^= y // entspricht x = x ^ y

3.2 Vergleichsoperatorenund logischeOperatoren

Um Bedingungen für Schleifen oder Verzweigungen zu formulieren, müssen Sie

Variablen vergleichen und oft mehrere Vergleiche miteinander kombinieren. Dieser

Abschnitt stellt Ihnen die dazu erforderlichen Operatoren vor.

Vergleichsoperatoren

DieVergleichsoperatoren ==, != (ungleich), <, <= sowie >und >= können gleichermaßen

für Zahlen und für Zeichenketten eingesetzt werden. Wie bei anderen Operatoren ist

es wichtig, dass auf beiden Seiten des Operators der gleicheDatentyp verwendet wird;

Sie können also nicht eine ganze Zahl mit einer Fließkommazahl vergleichen!

76

Page 23: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.2 Vergleichsoperatoren und logische Operatoren

1 == 2 // false

1 < 2 // true

"abc" == "abc" // true

"abc" == "Abc" // false

Zeichenketten gelten dann als gleich, wenn auch die Groß- und Kleinschreibung über-

einstimmt. Etwas schwieriger ist die Interpretation von größer und kleiner. Grund-

sätzlich gelten Großbuchstaben als kleiner als Kleinbuchstaben, d. h., sie werden beim

Sortieren vorne eingereiht. Internationale Zeichen werden auf der Basis der Unicode-

Normalform D verglichen. Die deutschen Buchstaben ä, ö oder ü werden dabei wie

eine Kombination aus zwei Zeichen betrachtet, beispielsweise ä = a". Somit gilt:

"A" < "a" // true

"a" < "ä" // true

"ä" < "b" // true

Mehr Details zur Sortierordnung von Zeichenketten und zu Möglichkeiten, diese zu

beeinflussen, folgen in Kapitel 8, »Zeichenketten«.

== versus ===

Zum Vergleich von Objekten kennt Swift neben == und != auch die Varianten === und

!==. Dabei testet a===b, ob die beiden Variablen a und b auf dieselbe Instanz einer

Klasse zeigen. Hingegen überprüft a==b, ob a und b zwei Objekte mit übereinstim-

menden Daten sind. Das ist nicht das Gleiche! Es ist ja durchaus möglich, dass zwei

unterschiedliche Objekte dieselben Daten enthalten.

Einschränkungen

Die Operatoren === und !== können nur auf Referenztypen angewendet werden,

nicht auf Werttypen (wie Zahlen, Zeichenketten, Arrays, Dictionaries sowie sonstige

Strukturen).

Umgekehrt können die Operatoren == und != bei selbst definierten Klassen nur ver-

wendet werden, wenn Sie für diese Klassen den Operator == selbst implementieren

(Protokoll Equatable, siehe Abschnitt 12.4, »Standardprotokolle«).

Die folgenden Zeilen definieren zuerst die Klasse Pt zur Speicherung eines Koordina-

tenpunkts und dann den Operator == zum Vergleich zweier Pt-Objekte. Damit ist das

Beispiel gleich auch ein Vorgriff auf die Definition eigener Operatoren.

77

Page 24: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

class Pt {

var x: Double , y: Double

// Init -Funktion

init(x: Double , y: Double ){

self.x=x

self.y=y

}

}

// Operator zum Vergleich von zwei Pt-Objekten

func ==(left: Pt, right: Pt) -> Bool {

return left.x == right.x && left.y == right.y

}

// == versus ===

var p1 = Pt(x: 1.0 , y: 2.0)

var p2 = Pt(x: 1.0 , y: 2.0)

p1 == p2 // true , weil die Objekte dieselben Daten enthalten

p1 === p2 // false , weil es unterschiedliche Objekte sind

Vergleiche mit ~=

Swift kennt mit ~= einen weiteren Vergleichsoperatormit recht wenigen Funktionen:

Zwei Ausdrücke des gleichen Typs werden wiemit == verglichen.

Außerdem kann getestet werden, ob eine ganze Zahl in einem durch den Range-

Operator formulierten Zahlenbereich enthalten ist.

-2...2 ~= 1 // true

-2...2 ~= -2 // true

-2...2 ~= 2 // true

-2...2 ~= 4 // false

Achten Sie darauf, dass Sie zuerst den Bereich und dann den Vergleichswert ange-

ben müssen. Wenn Sie die Reihenfolge vertauschen, funktioniert der Operator

nicht. Details zu Range-Operatoren folgen gleich.

Analog kann auch in switch-Ausdrückenmit case überprüft werden, ob sich ein ganz-

zahliger Ausdruck in einem vorgegebenen Bereich befindet:

let n = 12

switch n {

case (1...10) :

print ("Zahl zwischen 1 und 10")

case(11...20) :

print ("Zahl zwischen 11 und 20")

78

Page 25: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.2 Vergleichsoperatoren und logische Operatoren

default :

print ("Andere Zahl")

}

Datentyp-Vergleich (»is«)

Mit demOperator is testen Sie, ob eine Variable einem bestimmten Typ entspricht:

func f(obj: Any) {

if obj is UInt32 {

print("Datentyp UInt32 ")

...

}

}

Casting-Operator (»as«)

Mit dem Operator as wandeln Sie, sofern möglich, einen Datentyp in einen anderen

um. Der Operator hat in Swift drei Erscheinungsformen:

as: In dieser Form eignet sich as nur, wenn der Compiler erkennen kann, dass

die Umwandlung gefahrlos möglich ist. Das trifft auf alle Upcasts zu, also auf

Umwandlungen in Instanzen einer übergeordneten Klasse (siehe Abschnitt 12.1,

»Vererbung«), außerdem bei manchen Literalen (z. B. 12 as Float).

as?: Der Downcast-Operator as? typ stellt vor der Typkonvertierung sicher, dass

diese überhaupt möglich ist. Wenn das nicht der Fall ist, lautet das Ergebnis nil. Es

tritt kein Fehler auf.

Mit if let varname = ausdruck as? typ können Sie den Typtest mit einer Zuwei-

sung kombinieren. Das funktioniert gleichermaßen für Konstanten (let wie im

folgenden Beispiel) wie auch für Variablen (var):

func f(obj: Any) {

if let myint = obj as? UInt32 {

// myint hat den Datentyp UInt32

...

} else {

print("falscher Datentyp ")

}

}

as!: Mit einem nachgestellten Ausrufezeichen wird die Konvertierung auf jeden

Fall versucht. Dabei kann es zu einem Fehler kommen, wenn der Datentyp nicht

passt. Insofern ist diese Variante zumeist nur zweckmäßig, wenn die Typüberprü-

fung im Voraus erfolgt.

79

Page 26: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

let obj: Any = 123

if obj is UInt32 {

// wird nicht ausgef ührt, weil obj eine Int-Instanz enthält

var myint = obj as! UInt32

}

Upcasts und Downcasts

Ein Grundprinzip der objektorientierten Programmierung ist die Vererbung. Damit

können Klassen die Merkmale einer Basisklasse übernehmen und diese erweitern

oder verändern. Ein Objekt einer abgeleiteten Klasse (im Klassendiagrammunten dar-

gestellt) kann immer wie ein Objekt der Basisklasse verwendet werden (im Klassen-

diagramm oben). Das nennt man einen (impliziten) Upcast, also eine Umwandlung

in der Klassenhierarchie nach oben.

Eine Konvertierung in die umgekehrte Richtung ist ein Downcast. Dieser funktioniert

nur, wenn eine Variable vom Typ der Basisklasse tatsächlich ein Objekt der erfor-

derlichen abgeleiteten Klasse enthält. Mehr Details zu diesem Thema finden Sie in

Abschnitt 12.1, »Vererbung«.

Logische Operatoren

Logische Operatoren kombinieren Wahrheitswerte. Wahr UND Wahr liefert wieder

Wahr; Wahr UND Falsch ergibt hingegen Falsch. In Swift gibt es wie in den meis-

ten anderen Programmiersprachen die drei logischen Operatoren ! (Nicht), && (Und)

sowie || (Oder):

let a=3, b=5

a>0 && b<=10 // true

a>b || b>a // true

let ok = (a>b) // false

if !ok { // wenn ok nicht true ist, dann ...

print ("Fehler ") // ... eine Fehlermeldung ausgeben

}

&& und || führen eine sogenannte Short-Circuit Evaluation aus: Steht nach der Aus-

wertung des ersten Operanden das Endergebnis bereits fest, wird auf die Auswertung

des zweiten Ausdrucks verzichtet. Wenn im folgenden Beispiel a>b das Ergebnis false

liefert, dann ruft Swift die Funktion calculate gar nicht auf; der logische Ausdruck ist

in jedem Fall false, ganz egal, welches Ergebnis calculate liefern würde.

if a>b && calculate (a, b)==14 { ... }

80

Page 27: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.3 Range-Operatoren

3.3 Range-Operatoren

In Swift gibt es zwei Operatoren, um Bereiche für Zahlen oder Zeichenketten auszu-

drücken:

Der Closed-Range-Operator a...b beschreibt einen Bereich von a bis inklusive b.

Der Half-Open-Range-Operator a..<b beschreibt hingegen einen Bereich von a bis

exklusive b, entspricht also a...b-1.

Normalerweise werden diese Range-Operatoren für ganze Zahlen verwendet. Es gibt

aber auch Anwendungsfälle für Fließkommazahlen und Zeichenketten, auf die ich im

nächsten Abschnitt eingehe.

amuss kleiner als b sein, sonst ist der Ausdruck ungültig. Mit den Range-Operatoren

definierte Bereiche können in Schleifen, in switch-case-Ausdrücken sowie mit dem

vorhin vorgestellten Operator ~= verarbeitet werden.

for i in 1...10 {

print(i)

}

In der folgenden Schreibweise können Sie Zahlenbereiche zur Initialisierung eines

Integer-Arrays verwenden:

var ar = [Int](1...10) // entspricht var ar = [1, 2, ... , 10]

Mit map können Sie auf einen Zahlenbereich direkt eine Funktion (Closure) anwenden:

(1...5) .map { print($0) }

Die Operatoren ... und ..< sind in Wirklichkeit Kurzschreibweisen zur Erzeugung

von CountableRange- bzw. CountableClosedRange-Strukturen.

1.. <10 // entspricht CountableRange <Int >(1.. <10)

1...10 // entspricht CountableClosedRange <Int >(1...10)

CountableRange und CountableClosedRange sind also Datenstrukturen, die einen

Zahlenbereich repräsentieren. Die wichtigsten Eigenschaften sind startIndex und

endIndex. Sie geben den Start- bzw. Endwert des Bereichs an. contains überprüft, ob

eine bestimmte Zahl im Zahlenbereich enthalten ist.

var r = 1.. <10 // entspricht r = CountableRange <Int >(1.. <10)

r.startIndex // 1

r.endIndex // 10

r.contains (7) // true

r.contains (11) // false

81

Page 28: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

Darüber hinaus gibt es unzählige Methoden, um den Zahlenbereich zu verän-

dern (dropFirst, dropLast, reversed) bzw. um seine Elemente zu verarbeiten (filter,

forEach, map).

Range-Operatoren für Fließkommazahlen und Zeichenketten

Je nach Kontext können die Operatoren a...b und a..<b auch zur Formulierung eines

Intervalls verwendet werden – z. B. als Vergleichsbasis für switch bzw. für den schon

beschriebenen Operator ~=. In diesem Fall sind für a und b auch Fließkommazahlen

oder Zeichenketten (Character) erlaubt.

1...10 ~= 8 // true

1.7.. <2.9 ~= 2.3 // true

"a"..."z" ~= "f" // true

"0"..."9" ~= "x" // false

Allerdings gelten für Bereiche, deren Grunddatentyp nicht aufzählbar ist, viele Ein-

schränkungen. Beispielsweise ist es unmöglich, Schleifen über sie zu bilden:

for c in "a"..."z" { // Fehler , ClosedRange <String > does not

print (c) // conform to protocol sequence

}

Schleifen über einen Fließkommazahlenbereich

Um analog zu for i in 1...3 eine Schleife für eine double-Variable zu formulieren,

können Sie auf stride zurückgreifen. Diese Funktion stelle ich Ihnen in Kapitel 5, »Ver-

zweigungen und Schleifen«, vor.

3.4 Operatoren für Fortgeschrittene

Die wichtigsten Operatoren kennen Sie nun. Dieser Abschnitt ergänzt Ihr Wissen um

Spezial- und Hintergrundinformationen. Am interessantesten ist dabei sicherlich die

Möglichkeit, selbst eigene Operatoren zu definieren bzw. vorhandene Operatoren zu

überschreiben (Operator Overloading).

Ternärer Operator

Swift kennt drei Typen von Operatoren:

Unäre Operatoren (Unary Operators) verarbeiten nur einen Operanden. In Swift

zählen dazu das positive und negative Vorzeichen, das logische NICHT (also !bool)

und die Unwrapping-Operatoren ! und ? zur Auswertung von Optionals (also opt!

oder opt?).

82

Page 29: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.4 Operatoren für Fortgeschrittene

Binäre Operatoren verarbeiten zwei Operanden, also etwa das a * b. Die Mehrheit

der Swift-Operatoren fällt in diese Gruppe.

Ternäre Operatoren verarbeiten drei Operanden. In Swift gibt es nur einen derar-

tigen Vertreter, der daher einfach als der ternäre Operator bezeichnet wird – so, als

wären andere ternäre Operatoren undenkbar.

Die Syntax des ternären Operators sieht so aus:

a ? b : c

Wenn der boolesche Ausdruck a wahr ist, dann liefert der Ausdruck b, sonst c. Der

ternäre Operator eignet sich dazu, einfache if-Verzweigungen zu verkürzen:

// if-Schreibweise

let result :String

let x = 3

if x<10 {

result = "x kleiner 10"

} else {

result = "x größer-gleich 10"

}

// verkürzte Schreibweise mit dem ternären Operator

let x = 3

let result = x<10 ? "x kleiner 10" : "x größer gleich 10"

Unwrapping- und Nil-Coalescing-Operator

Anders als in den meisten anderen Programmiersprachen können mit einem Typ

deklarierte Swift-Variablen nie den Zustand null im Sinne von »nicht initialisiert«

annehmen. Swift bietet dafür die Möglichkeit, eine Variable explizit als Optional zu

deklarieren (siehe Abschnitt 4.2, »Optionals«). Dazu geben Sie explizit den gewünsch-

ten Datentyp an, demwiederum ein Fragezeichen oder ein Ausrufezeichen folgt:

var x: Int? = 3 // x enthält eine ganze Zahl oder nil

var y: Int! = 4 // y enthält eine ganze Zahl oder nil

var z: Int = 5 // z enthält immer eine ganze Zahl

x = nil // ok

y = nil // ok

z = nil // nicht erlaubt

Der Unterschied zwischen x und y besteht darin, dass das Auspacken (Unwrapping)

des eigentlichen Werts bei y automatisch erfolgt, während es bei x durch ein nach-

gestelltes Ausrufezeichen – den Unwrapping-Operator – erzwungen werden muss.

83

Page 30: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

Beachten Sie, dass die folgenden Zeilen beide einen Fehler verursachen, wenn x bzw.

y den Zustand nil aufweist!

var i: Int = x! // explizites Unwrapping durch x!

var j: Int = y // automatisches Unwrapping

Die Variablen x und y können also nil enthalten. nil hat eine ähnliche Bedeutung wie

bei anderen Sprachen null. Optionals sind aber gleichermaßen fürWert- und für Refe-

renztypen vorgesehen, was in manchen anderen Programmiersprachen nicht oder

nur auf Umwegen möglich ist. Allerdings können nur solche Klassen für Optionals

verwendet werden, die das Protokoll ExpressibleByNilLiteral einhalten.

Mit diesemVorwissen kommenwir nun zumNil-Coalescing-Operatora ?? b, der sich

ebenso schwer aussprechen wie übersetzen lässt. Bei ihm handelt es sich um eine

Kurzschreibweise des folgenden Ausdrucks:

a != nil ? a! : b

Wenn a initialisiert ist, also nicht nil ist, dann liefert a ?? b den Wert von a zurück,

andernfalls den Wert von b. Damit eignet sich b zur Angabe eines Defaultwerts. In

a! bewirkt das Ausrufezeichen das Auspacken (Unwrapping) des Optionals. Aus dem

Optional Typ?wird also der reguläre Datentyp Typ.

// k den Wert von x oder den Defaultwert -1 zuweisen

var k = x ?? -1 // der Datentyp von k ist Int

Optional Chaining

Ebenfalls mit Optionals hat die Operatorkombination ?. zu tun. Sie testet, ob ein Aus-

druck nil ergibt. Ist dies der Fall, lautet das Endergebnis nil. Andernfalls wird das

Ergebnis ausgepackt und der nächste Ausdruck angewendet. Wenn dieser ebenfalls

ein Optional liefert, kann auch diesem Ausdruck ein Fragezeichen hintangestellt wer-

den. Swift führt einen weiteren nil-Test durch. Diese Verkettung von nil-Tests samt

Auswertung, wenn der Ausdruck nicht nil ist, heißt in Swift »Optional Chaining«:

let a = optional ?.method ()?.property

let b = optional ?.method1 ()?.method2 ()?.method3 ()

Operator-Präferenz

Beim Ausdruck a + b * c rechnet Swift zuerst b*c aus, bevor es summiert – so wie Sie

es in der Schule gelernt haben. Generell gilt in Swift eine klare Hierarchie der Opera-

toren (siehe Tabelle 3.2). Um die Verarbeitungsreihenfolge zu verändern, können Sie

natürlich jederzeit Klammern setzen – also beispielsweise (a+b)*c.

84

Page 31: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.4 Operatoren für Fortgeschrittene

Priorität Operatoren

BitwiseShiftPrecedence << >>

MultiplicationPrecedence * / % &*

AdditionPrecedence + - &+ &- | ^

RangeFormationPrecedence ... ..<

CastingPrecedence is as

NilCoalescingPrecedence ??

ComparisonPrecedence < <= > >= == != === !=== ~=

LogicalConjunctionPrecedence &&

LogicalDisjunctionPrecedence ||

DefaultPrecedence (keine zugeordneten Operatoren)

TernaryPrecedence ! ?:

AssignmentPrecedence ! = *= /= %= += -= <<= >>= &= ^= |= &&= ||=

FunctionArrowPrecedence! ->

Tabelle 3.2 Hierarchie der binären Operatoren

In Swift gibt es vordefinierte Prioritätsgruppen (Precedence Groups). Die erste Spalte

der Operatorentabelle gibt neben dem Namen der Gruppe auch die Assoziativität

an (soweit definiert). Diese bestimmt, ob gleichwertige Operatoren von links nach

rechts oder von rechts nach links verarbeitet werden sollen. Beispielsweise ist -

(Minus) ein linksassoziativer Operator. Die Auswertung erfolgt von links nach rechts.

17 - 5 - 3 wird also in der Form (17 - 5)- 3 verarbeitet und ergibt 9. Falsch wäre

17 - (5 - 3) = 15!

Detailinformationen zu den Prioritätsgruppen sowie weitere Operator-Interna kön-

nen Sie im Proposal 0077 nachlesen. Es fasst all die Änderungen zusammen, die in

Swift 3 im Bereich der Operatoren durchgeführt wurden:

https://github.com/apple/swift-evolution/blob/master/proposals/

0077-operator-precedence.md

85

Page 32: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

3.5 EigeneOperatoren

Swift bietet die Möglichkeit, vorhandenen Operatoren für bestimmte Datentypen

neue Funktionen zuzuweisen (Operator Overloading). Außerdem können Sie voll-

kommen neue Operatoren definieren.

Operatoren sind aus der Sicht von Swift ein Sonderfall globaler Funktionen, wobei

der Funktionsname aus Operatorzeichen besteht. Insofern greift dieser Abschnitt

Kapitel 6, »Funktionen und Closures«, vor. Binäre Operatoren erwarten zwei, unäre

Operatoren einen Parameter.

Reservierte Operatoren

Die folgenden Zeichen, Zeichenkombinationen bzw. Operatoren sind reserviert und

können nicht verändert werden:

= -> // /* */ . > ! ?

Operator Overloading für komplexe Zahlen

Das folgende Beispiel zeigt, wie einfach Operator Overloading ist. Im Beispiel wird

zuerst die Datenstruktur Complex zur Speicherung komplexer Zahlen mit Real- und

Imaginärteil definiert. Die weiteren Zeilen zeigen die Implementierung der Operato-

ren + und * zur Verarbeitung solcher Zahlen.

// Beispieldatei operator -overloading .playground

// Datenstruktur zur Speicherung komplexer Zahlen

struct Complex {

var re: Double

var im: Double

// Init -Funktion , um eine neue komplexe Zahl zu erzeugen

init(re: Double , im: Double ) {

self.re=re

self.im=im

}

}

// Addition komplexer Zahlen

func + (left: Complex , right: Complex ) -> Complex {

return Complex (re: left.re + right .re, im: left.im + right .im)

}

86

Page 33: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.5 Eigene Operatoren

// Multiplikation komplexer Zahlen

func * (left: Complex , right: Complex ) -> Complex {

return Complex (re: left.re * right .re - left.im * right.im,

im: left.re * right .im + left.im * right.re)

}

// Vergleich komplexer Zahlen

func == (left: Complex , right: Complex ) -> Bool {

return left.re == right.re && left.im == right.im

}

func != (left: Complex , right: Complex ) -> Bool {

return !(left==right)

}

// Operatoren anwenden

var a = Complex (re: 2, im: 1) // 2 + i

var b = Complex (re: 1, im: 3) // 1 + 3i

var c = a + b // 3 + 4i

var d = a * b // -1 + 7i

Bei der Definition unärer Operatoren muss mit dem Schlüsselwort prefix bzw.

postfix angegeben werden, ob der Operator vor oder nach dem Operanden angege-

benwird. DieDefinition des Operators für negative Vorzeichen bei komplexen Zahlen

sieht so aus:

// negatives Vorzeichen für komplexe Zahlen

prefix func - (op: Complex ) -> Complex {

return Complex (re: -op.re, im: -op.im)

}

// Anwendung

var e = -d // 1 - 7i

Neuer Vergleichsoperator für Zeichenketten

Für aktuell nicht genutzte Zeichenkombinationen können Sie selbst neueOperatoren

definieren. Dazumüssen Sie den Operatormit infix|prefix|postfix operator zuerst

definieren und einer Prioritätsgruppe zuordnen (siehe Tabelle 3.2). Wenn Sie darauf

verzichten, zählt Ihr Operator automatisch zur Gruppe DefaultPrecedence .

Das folgende Beispiel definiert einen Vergleichsoperator für Zeichenketten, der nicht

zwischen Groß- und Kleinschreibung unterscheidet. infix bezeichnet dabei einen

Operator für zwei Operanden. Der Operator =~= erhält dieselbe Priorität wie die ande-

ren Vergleichsoperatoren.

87

Page 34: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3 Operatoren

// Datei comparision -operator .swift

// neuen Vergleichsoperator definieren , ...

infix operator =~= : ComparisonPrecedence

Die Implementierung greift auf die compare-Methode zurück. Besser lesbar, aber weni-

ger effizient wäre return left.uppercased()== right.uppercased().

// ... implementieren ,

func =~= (left: String , right: String ) -> Bool {

return left.compare (right , options : .caseInsensitive ) == .

orderedSame

}

// ... und ausprobieren

"abc" =~= "Abc" // true

"äöü" =~= "ÄöÜ" // true

Neuer Exponential-Operator in einer eigenen Prioritätsgruppe

Sie sind bei der Definition eigener Operatoren nicht auf die vorgegebenen Prioritäts-

gruppen beschränkt. Das folgende Beispiel greift eine Idee aus dem schon erwähnten

Proposal 0077 auf und definiert den Exponential-Operator ** für Double-Zahlen. Der

Operatorwird der ebenso neuenGruppe ExponentiationPrecedence zugeordnet. Diese

Gruppe hat eine höhere Priorität als MultiplicationPrecedence , mehrere aufeinander-

folgende Exponential-Operatoren werden von links nach rechts verarbeitet.

// Datei comparision -operator .swift

// neue Priorit ätsgruppe für Exponential -Operatoren

precedencegroup ExponentiationPrecedence {

associativity : left

higherThan : MultiplicationPrecedence

}

// neuer Exponential -Operator

infix operator ** : ExponentiationPrecedence

// Implementierung

func ** (base: Double , exponent : Double ) -> Double {

return pow(base , exponent )

}

let result = 1 + 2 ** 3 // 1 plus (2 hoch 3) , Ergebnis 9

88

Page 35: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

3.5 Eigene Operatoren

Weitere Beispiele für eigene Operatoren

In diesem Buch zeige ich Ihnen in mehreren Abschnitten, wie Sie eigene Operatoren

gewinnbringend zur Formulierung klareren Codes definieren können:

In Abschnitt 7.3, »CGFloat, CGPoint, CGSize und Co.«, zeige ich Ihnen, wie Sie Ope-

ratorendefinieren, umbequemBerechnungenmit Koordinatenpunkten, Vektoren

etc. durchzuführen.

In Abschnitt 8.5, »Zeichenketten und Zahlen umwandeln«, stelle ich Ihnen einen

Dreizeiler vor, der den aus Python bekannten Operator % zur Formatierung von

Zeichenketten definiert.

In Abschnitt 11.5, »Methoden«, habe ich in einemBeispiel, das denUnterschied zwi-

schen verschiedenen Methodentypen zeigt, auch die Operatoren < und > definiert.

Sie ermitteln, welcher von zwei 3D-Vektoren kürzer ist.

89

Page 36: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226
Page 37: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Kapitel 15

Hello iOS-World!

Mit diesem Kapitel beginnt nun endlich die konkrete iOS-Programmierung. In sei-

nem Zentrum steht ein einfaches Hello-World-Programm. Das Ziel ist es, Sie mit den

Grundfunktionen von Xcode sowie mit einigen Konzepten der iOS-Programment-

wicklung bekannt zu machen.

Bei der Lektüre dieses und auch des nächsten Kapitels werden Sie feststellen, dass

Swift vorübergehend in den Hintergrund rückt. Natürlich müssen wir da und dort

ein paar Zeilen Code schreiben; aber gerade bei den ersten iOS-Programmen geht

es vielmehr darum, den effizienten Umgang mit Xcode zu erlernen, die grafische

Gestaltung von Apps kennenzulernen und grundlegende Konzepte der iOS-Pro-

grammentwicklung zu verstehen. Dennoch setze ich ab diesem Kapitel voraus, dass

Sie zumindest über elementare Grundkenntnisse in Swift verfügen. Insbesondere die

grundlegenden Sprachstrukturen, Datentypen und der Umgang mit Optionals sollte

Ihnen geläufig sein.

Xcode per Video kennenlernen

Ich wäre nicht seit 30 Jahren mit Begeisterung Autor, würde ich nicht aus vollster

Überzeugung das Medium Buch lieben. Aber es heißt ja, ein Bild sagt mehr als tau-

sendWorte, undman könnte diese Analogie noch fortführen: Ein Video sagtmehr als

tausend Bilder. Mitunter stimmt das sogar, z. B. wenn es darum geht, die Bedienung

von Xcode zu erlernen.

Ohne Sie hier an die Konkurrenz verweisen zu wollen, möchte ich Ihnen doch ein

Video-Tutorial ans Herz legen, das qualitativ meilenweit über den vielen YouTube-

Filmchen der Art »Jetzt lerne ich iOS-Programmierung« steht. Die renommierte

Stanford Universität hat eine rund 20-stündige Vorlesung zum Thema »Developing

iOS 8 Apps with Swift« kostenlos im iTunes-U-Programm verfügbar gemacht. Um die

Videos ansehen zu können, benötigen Sie entweder iTunes auf Ihrem Mac oder die

App iTunesU für das iPad. Grundlegende Englischkenntnisse reichen aus, um demmit

vielen Screencasts unterlegten Vortrag zu folgen. Die Videos basieren momentan auf

Swift 2.0, es ist aber zu hoffen, dass es Anfang 2017 eine aktualisierte Fassung gibt,

die iOS 10 und vor allem Swift 3 berücksichtigt.

https://itunes.apple.com/de/course/developing-ios-9-apps-swift/id1104579961

369

Page 38: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

15.1 Projektstart

Um eine App für ein iOS-Gerät zu entwickeln, also für ein iPhone, ein iPad oder einen

iPod, starten Sie in Xcode ein neues Projekt und wählen zuerst den Typ iOS • Sin-

gle View Application. Das ist die einfachste Art von iOS-Apps. Anfänglich besteht

eine derartige App aus einer einzigen Ansicht, also aus einem »Bildschirm«, aus

einer »Seite«. Sie können aber später problemlos weitere Ansichten hinzufügen. Der

anfängliche Projekttyp schränkt Sie also nicht bei der späterenWeiterentwicklung der

App ein.

Im nächsten Dialogblatt geben Sie Ihrem Projekt einen Namen und wählen als Pro-

grammiersprache Swift sowie als Device Universal aus. Das bedeutet, dass Sie die

App später sowohl auf einem iPhone als auch auf einem iPad ausführen können.

Der Dialog enthält drei Optionen (siehe Abbildung 15.1), die Sie allesamt deaktiviert

lassen können und die in diesem Buch nicht weiter behandelt werden:

Use Core Data ist nur dann relevant, wenn Sie die Daten Ihrer App in einem

Objekt-Relationen-Mapping-Modell speichernmöchten.

IncludeUnit Tests und Include UI Tests fügen Ihrem Projekt jeweils ein eigenes

Verzeichnis hinzu, in dem Sie Testfunktionen für Ihren Code bzw. für die Benutzer-

oberfläche unterbringen können.

Abbildung 15.1 Projektoptionen für das Hello-iOS-Projekt

Zuletzt müssen Sie noch das Verzeichnis angeben, in dem Xcode die Code-Dateien

des neuen Projekts speichern soll.

370

Page 39: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.2 Gestaltung der App

15.2 Gestaltungder App

Das neue Projekt besteht aus einer ganzen Reihe von Dateien, deren Namen in

der linken Spalte von Xcode im Projektnavigator zu sehen sind. Sollte Xcode den

Projektnavigator nicht anzeigen, führen Sie Views •Navigator • Project Navigator

aus oder drücken einfach (Š)+(1). Im Projektnavigator klicken Sie nun auf die Datei

Main.storyboard.

Im Hauptbereich von Xcode sehen Sie jetzt das sogenannte Storyboard (siehe

Abbildung 15.2). Anfänglich besteht dieses Drehbuch für iOS-Apps aus nur einer, vor-

erst leeren Szene, also einer Bildschirmansicht der App. Bei vielen Apps gesellen sich

dazu später weitere Seiten, zwischen denen die Anwender dann navigieren können.

Im Hello-World-Beispiel wird es aber bei einer Ansicht bleiben.

Abbildung 15.2 Das Storyboard mit der einzigen Programmansicht der Hello-World-App

Device-Größe

Bei neuen iOS-Apps zeigt Xcode die Ansichten der App im Storyboard so an, wie diese

auf einem iPhone 6 im Hochformat aussehen würden. Wenn Sie in der Fußleiste des

Storyboard-Editors auf View as iPhone 6s klicken, blendet Xcode eine Auswahl von

iOS-Geräten mit anderen Bildschirmformaten ein. Per Knopfdruck können Sie nun

zwischen einem dieser Formate wählen (siehe Abbildung 15.2).

371

Page 40: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Dieses Feature ist neu in Xcode 8 und ermöglicht es Ihnen, blitzschnell zu überprü-

fen, wie Ihre App auf unterschiedlichen Geräten aussehen wird. Anfänglich wird Ihre

App nicht auf die unterschiedlichen Bildschirmproportionen und -maße reagieren.

Abhilfe schaffen sogenannte Layout-Regeln, die ich Ihnen in Abschnitt 15.5, »Layout

optimieren«, und detaillierter nochmals in Abschnitt 16.5, »Auto Layout«, vorstellen

werde.

Ich verwende bei der Entwicklung meiner Apps meistens die Device-Größe »iPhone

SE«. Das spart einerseits wertvollen Platz im Storyboard-Editor und gibt mir anderer-

seits eine gute Vorstellungdavon, wie die App auf dem kleinsten infrage kommenden

Gerät für iOS 10 aussehenwird. In der Regel ist die Optimierung für kleine Bildschirme

schwieriger als die für große. (Wenn Sie in den Projekteigenschaften dasDeployment

Target auf iOS 9.n zurücksetzen, können Sie auch noch Apps für das iPhone 4S entwi-

ckeln.)

Mini-Glossar

Bevor Sie damit beginnen, die Hello-World-App zu gestalten, sollten Sie zumindest

die wichtigsten Grundbegriffe aus der iOS-Entwicklerwelt kennen: Eine App kann

ausmehreren Ansichten bestehen. Solche Ansichten nennt Xcode Szenen. Jede Szene

kann diverse Steuerelemente enthalten, die das Aussehen der Ansicht bestimmen.

Alle Einstellungen aller Szenen sowie der darin enthaltenen Steuerelemente werden

im Storyboard gespeichert.

Jede Szene wirdmit einer Code-Datei verbunden, dem Controller. Im Controller legen

Sie fest, wie Ihre App auf Ereignisse reagiert. Der Controller bestimmt also, wie

sich Ihre App verhalten soll, wenn ein Benutzer einen Button berührt, einen Sli-

der verschiebt etc. Das dem Controller zugrunde liegende Programmiermuster, den

Model-View-Controller, stelle ich Ihnen in Abschnitt 16.1 näher vor.

Standardmäßig enthält ein neues Projekt vom Typ Single View Application die

Storyboard-Datei Main.storyboard mit der Szene »View-Controller« und dem zuge-

ordneten Controller in derDatei ViewController.swift. Um späterweitere Szenen hin-

zuzufügen, verschieben Sie einen View-Controller aus der Xcode-Objektbibliothek

in das Storyboard. Während im Storyboard beliebig viele Szenen gespeichert werden

können, benötigen Sie im Regelfall zu jeder Szene eine eigene Swift-Code-Datei mit

dem Controller. Mitunter können Sie auch eine Controller-Klasse mehreren ähnli-

chen Szenen zuordnen. Wie Sie selbst neue Controller-Klassen einrichten, beschreibe

ich in Abschnitt 17.1, »Storyboard und Controller-Klassen verbinden«.

372

Page 41: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.2 Gestaltung der App

Vorsicht bei Umbenennungen!

Die grafische Darstellung des Storyboards in Xcode ist sehr ansprechend. Intern han-

delt es sich beim Storyboard aber um eine simple XML-Datei. Dabei ist es wichtig zu

wissen, dass die Referenzen vom Storyboard auf Code-Elemente und Komponenten

ausschließlich in Form von Zeichenketten erfolgen.

Oft ist die Versuchung groß, Outlets, Actions, Klassennamen etc. nachträglich zu ver-

ändern, wenn sich die ursprünglich gewählten Namen als irreführend oder zu wenig

prägnant erweisen. Damit geraten Sie aber schnell in Teufels Küche. Xcode beklagt

sich dann über unbekannte Objekte in den Interface-Builder-Dateien, die aus dem

Storyboard generiert werden. Abhilfe schafft das Neueinfügen bzw. Neuverbinden

von Actions und Outlets bzw. die Neuzuordnung von Klassen; mitunter ist es aber

gerade für Xcode-Einsteiger schwierig, die wahre Ursache des Problems zu finden.

Steuerelemente einfügen

Die Benutzeroberfläche unserer Hello-World-App ist anfänglich leer. In die Ansicht

sollen nun zwei Bestandteile (Steuerelemente) eingebaut werden: Ein Button mit der

Aufschrift Hello World! und ein leeres Textfeld. Jedes Mal, wenn Sie den Button

Hello World! anklicken, soll im Textfeld eine neue Zeile mit dem aktuellen Datum

und der Uhrzeit eingefügt werden (siehe Abbildung 15.3).

Abbildung 15.3 Die Hello-World-App im iOS-Simulator

373

Page 42: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Xcode zeigt die zur Auswahl stehenden Steuerelemente normalerweise rechts unten

in der Objektbibliothek an. Sollten die Steuerelemente bei Ihnen nicht sichtbar sein,

blenden Sie diesen Bereich der Werkzeugleiste mit View•Utilities • Show Object

Library bzw. mit (ctrl)+(alt)+(Š)+(3) ein.

Xcode kann die Objektbibliothek in einer kompakten Icon-Ansicht oder in einer Lis-

tenansicht darstellen.Wechseln Sie gegebenenfalls mit demButton amunteren Rand

der Objektbibliothek in die übersichtlichere Listenansicht. Im daneben befindlichen

Suchfeld können Sie in der Liste rasch die gewünschten Einträge ermitteln – suchen

Sie nach button bzw. text view.

Klicken Sie zuerst den Button an, und verschieben Sie ihn per Drag&Drop in den

quadratischen View-Controller des Storyboards. Platzieren Sie den Button links oben,

und ändern Sie dann den Text von Button zu Hello World (siehe Abbildung 15.2).

Wenn Siemöchten, können Sie imAttributinspektor links oben in derWerkzeugleiste

die Button-Schrift etwas größer einstellen. Den Attributinspektor blenden Sie bei

Bedarf mit (alt)+(Š)+(4) ein.

Nun ist das Text-View-Steuerelement an der Reihe: Auch dieses verschieben Sie per

Drag&Drop aus der Objektbibliothek in das Storyboard. Platzieren Sie das Steuer-

element unterhalb des Buttons, und stellen Sie die Größe so ein, dass es circa ein

Viertel des quadratischen Storyboards füllt. Wie gesagt, mit den Feinheiten des Lay-

outs beschäftigen wir uns später. Stellen Sie nun die gewünschte Textgröße ein, und

löschen Sie den Blindtext »Lorem ipsum . . . « im Attributinspektor.

Wenn Sie möchten, können Sie dem Textfeld auch noch eine andere Hintergrund-

farbe zuweisen – dann erkennen Sie später bei der Programmausführung besser die

tatsächlichen Ausmaße des Steuerelements. Zur Farbeinstellung scrollen Sie im Attri-

butinspektor nach unten, bis Sie im Bereich View das Feld Background finden.

Ein erster Test mit dem iOS-Simulator

Nachdem wir nun die minimalistische Oberfläche unserer App gestaltet haben,

spricht nichts dagegen, das Programm ein erstes Mal zu starten. Dazu wählen Sie in

der Symbolleiste des Xcode-Fensters zuerst das Gerät aus, das Sie simulieren möch-

ten. Zur Auswahl steht die gängige iOS-Hardware-Palette.

Ein Klick auf den dreieckigen Run-Button kompiliert das Programm und übergibt es

zur Ausführung an den iOS-Simulator (siehe Abbildung 15.3). Dabei handelt es sich

um ein eigenständiges Programm, das getrennt von Xcode läuft. Wie der Name ver-

muten lässt, simuliert es ein iPhone bzw. iPad, wobei das zu testende Programm zur

Ausführung automatisch installiert wird. Der Simulator ist zumindest für erste Tests

gut geeignet. Für »echte« Apps führt an Tests auf richtiger Hardware aber natürlich

kein Weg vorbei.

374

Page 43: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.2 Gestaltung der App

Spracheinstellungen im Simulator

Im Simulator gelten anfänglich englische Spracheinstellungen. Das lässt sich wie auf

einem richtigen Gerät in den Systemeinstellungen beheben. Dazu beenden Sie die

laufende Hello-World-App durch einen per Menü mit Hardware •Home simulierten

Druck auf den iPhone-Button. Anschließend starten Sie die vorinstallierte App Set-

tings, navigieren in den Dialog General • Language & Region und stellen dort die

Sprache Deutsch und die Region Germany ein.

Diesen Vorgangmüssen Sie für jedes iOS-Gerät wiederholen, das Sie testen möchten.

Die Einstellungenwerden also nicht über alle simulierten Geräte geteilt.

Da die Veränderung der Spracheinstellungen in allen iOS-Geräten recht umständlich

ist, bietet Xcode auch die Möglichkeit, mit Product • Scheme • Edit Scheme festzu-

legen, in welcher Sprache die App ausgeführt werden soll. Das Hello-World-Kapitel

ist aber nicht der richtige Ort für diese schon recht fortgeschrittenen Funktionen.

Details zum Umgangmit Schemes und zur Entwicklungmehrsprachiger Apps folgen

in Abschnitt 29.4.

Im iOS-Simulator können Sie nun den Button Hello World! anklicken. Das Pro-

gramm wird darauf aber nicht reagieren, weil der Button ja noch nicht mit Code

verbunden ist. Wenn Sie das Textfeld anklicken, können Sie über die Tastatur Ihres

Computers sowie über die im Simulator eingeblendete Bildschirmtastatur Text ein-

geben. Die Test-App läuft, bis Sie sie in Xcodemit dem Stopp-Button beenden.

Ärger mit der Tastatur

Sie können im iOS-Simulator mit der Tastatur Ihres Computers Eingaben durchfüh-

ren. Das ist effizient, aber nicht realitätsnah: Der Simulator betrachtet Ihre Tastatur

als mit dem iOS-Gerät verbunden und blendet deswegen die iOS-Bildschirmtastatur

aus. Mit dem Kommando Hardware • Keyboard • Connect Hardware Keyboard im

iOS-Simulator können Sie auswählen, ob Sie Ihre Computertastatur oder die Bild-

schirmtastatur von iOS verwenden möchten.

Sobald die iOS-Bildschirmtastatur einmal im iOS-Simulator erscheint, tritt ein wei-

teres Problem auf: Es scheint keine Möglichkeit zu geben, die Tastatur wieder loszu-

werden. Das ist das in iOS vorgesehene Verhalten – wenn die Eingabe abgeschlossen

ist, muss die Tastatur per Code explizit ausgeblendet werden, in der Regel durch die

Anweisung view.endEditing(true). Im Hello-World-Projekt verzichten wir darauf.

Praktische Details zum richtigen Umgang mit Textfeldern folgen in Abschnitt 16.7,

»Texteingaben«, sowie in mehreren Beispielprojekten in Teil IV dieses Buchs.

375

Page 44: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

15.3 Steuerung der App durch Code

Damit das Berühren bzw. im Simulator das Anklicken des Buttons eine sichtbare

Wirkung zeigt, soll die App jetzt so erweitert werden, dass in das Textfeld jedes Mal

eine Zeile mit demDatum und der aktuellen Uhrzeit hinzugefügt wird. Das erfordert

einige Zeilen eigenen Swift-Code.

Den Buttonmit einer Methode verbinden (Actions)

Mit der App-Ansicht (Szene) verbundener Code muss nun in die bereits vorgesehene

Datei ViewController.swift eingetragen werden. Xcode unterstützt diesen Vorgang,

sofern das Storyboard und die damit verbundene Datei ViewController.swift neben-

einander angezeigt werden. Genau das bewirkt der Button mit den »Eheringen«: Er

blendet zur gerade aktivenDatei den sogenannten Assistenzeditor ein, also eine zuge-

ordnete zweite Datei.

Platz sparen in Xcode

Wenn Sie nicht gerade auf einem sehr großen Monitor arbeiten, wird der Platz in

Xcode jetzt knapp. Links sitzt der Projektnavigator, in der Mitte das Storyboard und

der Code des Controllers und rechts noch die Werkzeugleiste – das ist zu viel! Blen-

den Sie deswegen vorübergehend die beiden Seitenleisten aus. Die entsprechenden

Buttons finden Sie rechts oben in der Xcode-Symbolleiste.

ViewController.swift enthält den Swift-Code für eine Klasse mit dem Namen View-

Controller. Diese Klasse ist von der UIViewController-Klasse abgeleitet. Wie der Name

vermuten lässt, steuert diese Klasse das App-Erscheinungsbild. Der View-Controller

enthält bereits zwei leere Methoden. Diese sind für uns vorerst aber nicht von Inte-

resse; wenn Sie möchten, können Sie sie löschen. In diesem Hello-World-Beispiel

benötigen wir sie nicht.

Dafür möchten wir nun eine Methode in den Code einbauen, die ausgeführt wird,

wenn der ButtonHelloWorld angeklickt wird. Dazu drücken Sie die Taste (ctrl) und

ziehen den Button vom Storyboard in den Assistenzeditor. DieMethode soll direkt in

der Klasse und nicht innerhalb einer anderen Methode eingefügt werden. Achten Sie

darauf, die Maus- bzw. Trackpad-Taste an der richtigen Stelle loszulassen! Bis dahin

markiert eine blaue Linie die Verbindung, die Sie herstellenmöchten.

Sobald Sie dieMaus bzw. das Trackpad losgelassenhaben, erscheint einDialog, in dem

Sie die Details der Verbindung einstellen können (siehe Abbildung 15.4). Für uns sind

folgende Einstellungen zweckmäßig:

376

Page 45: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.3 Steuerung der App durch Code

Connection = Action: Wir wollen auf ein Ereignis reagieren. Der Begriff »Action«

bezieht sich dabei auf das Target-Action-Entwurfsmuster, bei demeineMethode in

die eigene Controller-Klasse eingebaut wird. Sie gilt als »Ziel«, das angesprungen

wird, wenn das entsprechende Ereignis auftritt.

Name: Hier geben wir der zu erstellenden Methode einen möglichst aussagekräf-

tigen Namen. Ich habe mich bei diesem Beispiel für hwButtonTouch entschieden.

Wenn Sie das Beispiel selbst ausprobieren, können Sie hier einen beliebigen ande-

ren Namen wählen.

Type = AnyObject oder UIButton: Diese Einstellung gibt an, in welcher Form

Daten an die Methode übergeben werden sollen. Im Hello-World-Beispiel werten

wir diese Daten aber ohnehin nicht aus – insofern ist die Einstellung egal. Wollten

wir den Text des Buttons oder andere Eigenschaften auslesen, wäre es zweckmäßig,

hier UIButton einzustellen.

Event = Touch Up Inside: Hier wird festgelegt, auf welches Ereignis wir reagieren

möchten. Die Defaulteinstellung passt hier: Wenn der Button innen berührt wird,

soll unser Code ausgeführt werden.

Arguments = Sender: In der Auswahlliste können Sie festlegen, welche Daten an

die Methode übergeben werden sollen. Zur Auswahl stehen Sender, Sender and

Event oder None. Die Einstellung Sender bedeutet, dass eine Referenz auf das

Objekt übergeben wird, das die Aktion ausgelöst hat. Das vereinfacht die Auswer-

tung derDaten dieses Objekts – insbesondere dann, wenn Sie eine Action-Methode

mit mehreren Steuerelementen verbinden.

Abbildung 15.4 Der Button des Storyboards (links) wird durch ctrl-Drag mit einer neuen

Methode im ViewController-Code (rechts) verbunden.

377

Page 46: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Die hier so langatmig beschriebenen Einstellungen nehmen Sie mit etwas Übung in

gerade mal 15 Sekunden vor. Xcode belohnt diese Arbeit mit einer Methodendefini-

tion, die aus zwei Zeilen Code besteht:

// Projekt hwios -world , Datei ViewController .swift

@IBAction func hwButtonTouch (_ sender : UIButton ) {

// todo: Code verfassen

}

Der Code allein reicht nicht!

Angesichts des doch recht umständlichen Mausgeklickes liegt es nahe, den wenigen

Code einfach selbst einzutippen. Das ist aber keine gute Idee! Mit dem Code an sich

ist es nämlich nicht getan. Hinter den Kulissen merkt sich Xcode auch, mit welchem

Steuerelement und mit welchem Ereignis die Methode verknüpft ist. Diese Meta-

daten landen in der XML-Datei Main.storyboard. Die Verbindung stellt Cocoa Touch

dynamisch zur Laufzeit her. Das kompilierte Storyboard enthält dafür eine Referenz

auf den serialisierten View-Controller und den Selektor auf die Methode.

Zugriff auf das Textfeld über eine Eigenschaft (Outlets)

Bevor wir die Methode hwButtonTouch mit konkretem Code füllen können, benötigen

wir noch eineMöglichkeit, um auf das Textfeld zuzugreifen. Dazu stellenwir eine wei-

tere Verbindung zwischen der App-Ansicht im Storyboard und dem Code her: Wieder

mit (ctrl) ziehen wir diesmal das Text-View-Steuerelement in den Codebereich, ver-

wenden diesmal aber andere Einstellungen (siehe Abbildung 15.5):

Connection = Outlet: Wir wollen auf das Steuerelement zugreifen können.

Xcode soll also eine entsprechende Eigenschaft in die ViewController-Klasse ein-

bauen, die auf das Objekt verweist. In der iOS-Nomenklatur wird das als Outlet

bezeichnet.

Name: Das ist der Name, unter dem wir das Steuerelement ansprechen möchten.

Ich habe textView angegeben.

Type = UITextView: Das Steuerelement ist eine Instanz der UITextView-Klasse –

und unter diesem Typmöchten wir auf das Steuerelement auch zugreifen.

Storage = Weak: Hier geht es darum, ob die Referenz auf das Steuerelement

sicherstellt, dass dieses im Speicher bleibt. Das ist nicht notwendig: Das Steuer-

element kommt uns sicher nicht abhanden. Insofern können wir die Defaultein-

stellungWeak bedenkenlos übernehmen.

378

Page 47: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.3 Steuerung der App durch Code

Abbildung 15.5 Einstellungen für das textView-Outlet

Die resultierende Code-Zeile sieht so aus:

@IBOutlet weak var textView : UITextView !

Damit ist also eine neue Eigenschaft (Klassenvariable) mit dem Namen textView defi-

niert. Wir können damit auf ein Steuerelement vom Typ UITextView zugreifen, wobei

der Typ als Optional angegeben ist. Der Grund dafür ist, dass die Initialisierung des

Steuerelements möglicherweise nicht sofort beim App-Start, sondern erst etwas spä-

ter erfolgt. Indem die Eigenschaft als Optional deklariert ist, wird klar, dass ein Zugriff

auf das Steuerelement unter Umständen noch gar nicht möglich ist.

Die Attribute »@IBAction« und »@IBOutlet«

Sicher ist Ihnen aufgefallen, dass Xcode die Methode mit dem Attribut @IBAction

und die Eigenschaft mit dem Attribut @IBOutlet gekennzeichnet hat. Der Interface

Builder erkennt anhand dieser Attribute, zu welchen Elementen der Programmierer

Verbindungen erlaubt bzw. herstellen darf. Der Interface Builder ist jener Teil von

Xcode, der zur Gestaltung grafischer Benutzeroberflächen dient.

Endlich eigener Code

Sie können die App zwischenzeitlich noch einmal starten. Am Verhalten der App hat

sich aber nichts verändert. Die Methode hwButtonTouch ist ja noch leer, und auch die

zusätzliche Eigenschaft textView ist noch ungenutzt. Aber das ändert sich jetzt end-

lich! Jedes Mal, wenn der Button Hello World berührt wird, soll das Textfeld um

eine Zeile mit Datum und Uhrzeit ergänzt werden. In einer ersten Testversion könnte

der Code wie folgt aussehen:

// Projekt Hello iOS, Datei ViewController .swift

import UIKit

class ViewController : UIViewController {

@IBOutlet weak var textView : UITextView !

379

Page 48: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

@IBAction func hwButtonTouch (_ sender : UIButton ) {

let now = Date()

let formatter = DateFormatter ()

formatter .dateFormat = "d.M.yyyy H:mm:ss"

textView .text? += formatter .string (from: now) + "\n"

}

}

Auf den Abdruck der standardmäßig vorhandenen, aber leeren Methoden viewDid-

Load und didReceiveMemoryWarning habe ich verzichtet. In diesem Beispiel können Sie

diese Methoden aus dem Code löschen, wir brauchen sie nicht.

Outlets wie die Eigenschaft textView sind Optionals. Es liegt in der Natur von Optio-

nals, dass diese den Zustand nil haben können. Tatsächlich ist dies aber nur vor der

Initialisierung der Ansicht der Fall. Sobald die Ansicht auf einem iOS-Gerät sicht-

bar wird und Action-Methoden ausführen kann, können Sie sich darauf verlassen,

dass Outlet-Eigenschaften nicht nil sind. Genau genommen gilt dies ab dem Zeit-

punkt, zu dem im View-Controller die Methode viewDidLoad ausgeführt wurde (siehe

Abschnitt 16.3, »Die UIViewController-Klasse«).

Hintergrundinformationen zum Umgang mit Datum und Uhrzeit können Sie bei

Bedarf in Kapitel 9 nachlesen. Somit bleibt nur noch der Ausdruck textView.text zu

erklären: Ein Blick in die Dokumentation des UITextView-Steuerelements zeigt, dass

der Inhalt des Textfelds über die Eigenschaft text gelesen und verändert werden

kann. Der Datentyp von text lautet String?, es handelt sich also um ein Optional, das

beim Zugriff explizit durch ein nachgestelltes Fragezeichen oder Ausrufezeichen aus-

gepackt werdenmuss.

Der schnellste Weg zur Dokumentation

Wenn Sie zum ersten Mal ein UITextView-Steuerelement nutzen, kennen Sie die Ele-

mente dieser Klasse noch nicht. Eine kurze Beschreibung der Klasse erhalten Sie,

wenn Sie das Schlüsselwort UITextView im Code zusammen mit (alt) anklicken. Am

unteren Rand der eingeblendeten Infobox befindet sich ein Link auf die Klassenrefe-

renz, die in einem eigenen Fenster geöffnet wird (siehe Abbildung 15.6).

Jetzt ist es höchste Zeit, die App im Simulator endlich auszuprobieren. Einige Klicks

auf den Button beweisen, dass das Programm wie erwartet funktioniert (siehe

Abbildung 15.3). Einen Preis für innovatives Layout wird es freilich nicht gewinnen.

380

Page 49: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.4 Actions und Outlets für Fortgeschrittene

Abbildung 15.6 Der Hilfebrowser von Xcode

15.4 Actions und Outlets für Fortgeschrittene

Sie haben nun eine erste Vorstellung davon, wie Actions und Outlets funktionieren.

Dieser Abschnitt weist auf einige Besonderheiten im Umgang mit Actions und Out-

lets hin.

Eine Action für mehrere Steuerelemente

Es ist zulässig, ein und dieselbe Action-Methode für mehrere Steuerelemente zu ver-

wenden. Dazu richten Sie zuerst für ein Steuerelement die Methode ein. Danach

führen Sie eine (ctrl)-Drag-Operation für das zweite Steuerelement aus, wobei Sie als

Ziel die bereits vorhandeneMethode verwenden. Achten Sie darauf, dass die gesamte

Methode blau unterlegt wird – dann hat Xcode erkannt, dass Sie nicht eine Action in

derMethode einfügen möchten (das funktioniert nicht), sondern dass Sie das Steuer-

elementmit der vorhandenen Methode verbinden möchten.

Naturgemäß müssen Sie die Methode nun ein wenig modifizieren: Erst mit einer

Auswertung des sender-Parameters können Sie erkennen, welches Steuerelement den

Aufruf der Methode ausgelöst hat. Wenn Sie beispielsweise mehrere Buttons mit

einer Methode verbunden haben, können Sie wie folgt den Text des Buttons ausge-

ben:

@IBAction func btnAction (_ sender : UIButton ) {

print (sender .currentTitle !)

}

381

Page 50: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Ein Outlet für mehrere Steuerelemente (Outlet Collections)

Auch der umgekehrte Fall ist möglich – Sie können mehrere Steuerelemente über

ein Outlet ansprechen. Genau genommen handelt es sich dann nicht mehr um

ein einfaches Outlet, sondern um eine Outlet Collection. Dazu markieren Sie das

erste Steuerelement, ziehen es mit (ctrl)-Drag in den Controller-Code und wählen

Connection = Outlet Collection (siehe Abbildung 15.7). Xcode erzeugt anstelle

einer einfachen Outlet-Variablen nun ein Array:

@IBOutlet var allButtons : [UIButton ]!

In der Folge verbinden Sie auch die weiteren Steuerelemente durch (ctrl)-Drag mit

diesem Array. Xcode ist leider nicht in der Lage, mehrere markierte Steuerelemente

auf einmal zu verbinden. Im Code können Sie nun unkompliziert Schleifen über alle

so verbundenen Steuerelemente bilden.

Abbildung 15.7 Dialog zum Einrichten einer Outlet-Collection

Actions oder Outlets umbenennen

Wenn Sie im Code Actions oder Outlets einfach umbenennen, funktioniert Ihre

App nicht mehr. Xcode merkt sich die Verknüpfung zu Ihren Methoden bzw. Eigen-

schaften in Form von Zeichenketten. Nach der Umbenennung ist keine korrekte

Zuordnung mehr möglich.

Abhilfe: Klicken Sie im Storyboard-Editor das betreffende Steuerelementmit der rech-

ten Maus- oder Trackpad-Taste an. Ein Kontextmenü zeigt nun alle Zuordnungen zu

Actions oder Outlets (siehe Abbildung 15.8). Dort löschen Sie die Action- oder Outlet-

Verknüpfung, die Sie umbenannt haben. Sollten Sie das vergessen, wird die App

abstürzen, wobei die Fehlermeldung unrecognized selector lautet.

Anschließend wiederholen Sie die (ctrl)-Drag-Operation und ziehen die Verknüp-

fungslinie direkt zur schon vorhandenen, von Ihnen umbenannten Methode oder

Eigenschaft. Damit wird die Verknüpfung wieder neu hergestellt, und Sie müssen

nicht alle Einstellungen wiederholen.

382

Page 51: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.5 Layout optimieren

Abbildung 15.8 Die rechteMaus- oder Trackpad-Taste führt in eine Liste aller Actions und

Outlets eines Steuerelements.

Steuerelemente kopieren

Wenn Sie Steuerelemente mit (Š)+(C) und (Š)+(V) kopieren, werden dabei alle mögli-

chen unsichtbaren Attribute und Eigenschaften mitkopiert, unter anderem zugeord-

nete Actions. Oft erspart Ihnen das eine wiederholte Einstellung dieser Merkmale,

abermitunter führt dieses Verhalten zu unerwarteten Nebenwirkungen. Ein Klick auf

das Steuerelementmit der rechtenMaus- oder Trackpad-Taste offenbart alle zugeord-

neten Outlets und Actions.

15.5 Layout optimieren

Es ist Ihnen sicher aufgefallen, dass das Layout unserer App, also die Anordnung und

Größe der Steuerelemente, verbesserungswürdig ist. Die Größe der Steuerelemente

ist willkürlich. Wenn Sie die App in verschiedenen iOS-Geräten ausprobieren, werden

Sie feststellen, dass teilweise große Teile des Bildschirms ungenutzt bleiben, während

das Textfeld bei anderen Geräten womöglich sogar abgeschnitten und unvollständig

dargestellt wird. Besonders deutlich werden die Layoutdefizite, wenn Sie den iOS-

Simulator mitHardware • Rotate in das Querformat drehen.

Wie würden unsere Layoutwünsche denn aussehen?

383

Page 52: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Der Button soll ohne unnötige Abstände links oben im Bildschirm dargestellt wer-

den.

Das Textfeld soll darunter platziert sein.

Es soll die gesamte verbleibende Größe des Bildschirms nutzen.

Es soll seine Größe bei einer Drehung des Geräts automatisch anpassen.

Momentan wird unser ProgrammdiesenWünschen deswegen nicht gerecht, weil wir

die Position und Größe der Steuerelemente absolut festgelegt haben. Wir haben die

Steuerelemente im View weitgehend nach Gutdünken platziert.

Layoutregeln

Die Lösung, die Xcode bzw. eigentlich das UIKit, also das Framework zur iOS-Program-

mierung, hierfür anbietet, heißt Layoutregeln (Constraints). Sie können also für jedes

Steuerelement Regeln aufstellen, die dieses einhalten soll. Das UIKit bemüht sich

dann, in Abhängigkeit von der gerade vorliegenden Form und Größe des iOS-Geräts,

allen Regeln gerecht zu werden. Beispiele für derartige Regeln sind:

Der horizontale Abstand zwischen dem Steuerelement A und seinem nächstgele-

genen linken oder rechten Nachbarn soll 8 Punkte betragen. Bei Retina-Geräten

mit doppelter Auflösung entspricht das 16 Pixeln.

Der vertikale obere Abstand zwischen dem Steuerelement A und dem Bildschirm-

rand soll 16 Punkt betragen.

Steuerelement A soll genauso breit sein wie Steuerelement B.

Steuerelement A soll innerhalb seines Containers vertikal und/oder horizontal zen-

triert werden.

Die linken Ränder der Steuerelemente A, B und C sollen in einer Linie verlaufen.

Wenn wir also erreichen möchten, dass die Steuerelemente der Hello-World-App wie

oben formuliert angeordnet werden, müssen wir nur die entsprechenden Regeln

formulieren. Mit etwas Erfahrung gelingt dies rasch; gerade Einsteiger in die iOS-Pro-

grammierung scheitern aber oft an der damit verbundenen Komplexität.

Glücklicherweise macht Xcode 8 es einfacher denn je, Layoutregeln sofort zu testen,

ohne die App jedes Mal neu starten zu müssen: Dazu verändern Sie einfach in der

Fußleiste von Xcode das iOS-Device und seine Orientierung. Xcode passt dann die

View an die neue Gerätegröße an, und Sie erkennen sofort, ob die Steuerelemente

wunschgemäß platziert werden.

384

Page 53: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.5 Layout optimieren

Layoutregeln für den »Hello-World«-Button

Eine detaillierte Erklärung der Layoutregeln erhalten Sie in Abschnitt 16.5. An dieser

Stelle möchte ich Ihnen nur rezeptartig erklären, wie Sie das Layout der Hello-World-

App korrekt einstellen. Dazu klicken Sie im Storyboard zuerst auf den Button Hello

World, dann auf den Button Pin, der sich rechts unten im Editor befindet (siehe

Abbildung 15.9).

Abbildung 15.9 Die vier winzigen Layout-Button befinden sich rechts unten im Storyboard-

Editor.

Abbildung 15.10 Layoutregeln für den Hello-World-Button festlegen

Damit erscheint derDialogAddNewConstraints zur Einstellung diverser Abstände

(sieheAbbildung 15.10). Dort klicken Sie zuerst die Verbindungsstege für die Abstände

nach oben bzw. zur linken Seite an, sodass diese Stege durchgängig rot angezeigt

werden. Anschließend geben Sie für denAbstand nachoben 8Punkte und für den seit-

385

Page 54: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

lichen Abstand 0 Punkte an. Standardmäßig ist die Option Constrain to margins

aktiv. Sie bewirkt, dass diese Abstände relativ zu einem vom jeweiligen iOS-Gerät vor-

gegebenen Standardrahmen gerechnet werden. Zuletzt schließen Sie den Dialog mit

demButton Add 2 Constraints. Damit werden zwei neue Regeln zur Positionierung

des Buttons festgelegt.

Überraschenderweise führen die neuen Regeln nicht zu einer Veränderung der Posi-

tion des Steuerelements. Vielmehr zeigen orange strichlierte Linien an,woder Button

bei der Programmausführungplatziertwird (sieheAbbildung 15.11), wenndie Position

zur Laufzeit eine andere ist als momentan im Storyboard-Editor. Außerdem visuali-

sieren zwei orange Stege die von Ihnen aufgestellten Regeln. Aus den Zahlenwerten

geht hervor, umwie viele Punkte das Element aktuell falsch positioniert ist.

Abbildung 15.11 Der Storyboard-Editor zeigt, wo der Button später platziert wird.

Um den Button den neuen Regeln entsprechend zu positionieren, klicken Sie auf

den Button Resolve Auto Layout Issues und führen dort das Kommando Selected

Views •Update Frames aus.

Stack-View-Button rückgängig machen

Die Buttons Align, Pin und Resolve Auto Layout Issues führen jeweils in Dialoge

oder Menüs, in denen Sie die jeweilige Aktion auswählen bzw. bestätigen. Es besteht

also keine Gefahr, dass Sie irrtümlich eine Aktion durchführen, die Sie nicht wollen.

Ganz anders verhält sich der Button Stack View: Sofern im Storyboard-Editor gerade

ein Steuerelement markiert ist bzw. mehrere Steuerelemente markiert sind, werden

diese in eine Stack-View verpackt, also in einen Container, der bei der Anordnung

der Steuerelemente helfen soll. Diese Aktion erfolgt sofort, ohne Rückfrage und ohne

visuelles Feedback, also oft ungewollt und unbemerkt.

Ungewollte Stack-View-Verschachtelungen erkennen Sie, wenn Sie im Storyboard-

Editor die Seitenleiste Document Outline aktivieren. Sie zeigt die hierarchische

Struktur aller Steuerelemente im Storyboard-Editor. Dort können Sie bei Bedarf die

betroffenen Steuerelemente aus der Stack-View herausziehen (siehe Abbildung 15.12).

Danach können Sie die Stack-Views in der Seitenleiste anklicken und löschen.

386

Page 55: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.5 Layout optimieren

Abbildung 15.12 Ungewollte Stack-View-Verschachtelungen auflösen

Stack-Views richtig einsetzen

Stack-Views sind ein durchaus nützliches Feature, das dabei hilft, allzu komplizierte

Layout-Regeln zu vermeiden. Den richtigen Umgang mit Stack-Views erläutere ich

Ihnen in Abschnitt 16.6.

Die Document-Outline-Seitenleiste verstehen

Die Document-Outline zeigt, wie die Steuerelemente (Views) innerhalb eines View-

Controllers ineinander verschachtelt sind (siehe Abbildung 15.12), und sie hilft dabei,

das gewünschte Element auszuwählen, wenn zwei Elemente übereinander platziert

sind. Innerhalb des Objektbaums erhält jedes Element standardmäßig einen Namen,

der seiner Klasse entspricht – z. B. View für ein UIView-Objekt. Bei einigen Steuerele-

menttypen, z. B. bei Buttons und Labels, wird der dort eingetragene Text angezeigt –

also Noch ein Button statt einfach Button.

Sie können imObjektbaum alleObjekte durch einfaches Anklicken umbenennen. Das

ist dann sinnvoll, wenn es mehrere gleichartige Objekte gibt, die Sie im Storyboard-

Editor leichter identifizieren wollen. Beachten Sie aber, dass die Objektnamen in der

Document-Outline-Seitenleiste ausschließlich für den Storyboard-Editor von Xcode

gelten!

Im Code Ihrer View-Controller-Klassehaben Sie keineMöglichkeit, den Namen festzu-

stellen, den Sie einem Objekt in der Outline-Seitenleiste gegeben haben. Sie können

zur Identifizierung von Steuerelementen im Code auf die tag-Eigenschaft zurückgrei-

fen. In dieser auch in Xcode zugänglichen Eigenschaft können Sie allerdings nur eine

ganze Zahl speichern. Eine zweite Möglichkeit besteht darin, eine eigene Klasse mit

einer neuen Eigenschaft zu definieren. Ein Beispiel dafür finden Sie in Abschnitt 20.3,

»Focus Engine«.

387

Page 56: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Layoutregeln für das Textfeld

Nun ist das Textfeld an der Reihe: Nachdem Sie dieses angeklickt haben, öffnen Sie

wieder mit dem Pin-Button den Dialog Add New Constraints. Dort stellen Sie die

folgenden Abstände ein (siehe Abbildung 15.13):

Links: 0 Punkte. Dieser Abstand gilt wegen der Option Constrain to margins

relativ zum Standardrahmen.

Oben: 0 Punkte. Dieser Abstand wird relativ zum nächstgelegenen Steuerelement

gerechnet, in diesem Fall also zum Button.

Rechts: 0 Punkte. Dieser Abstand gilt wieder relativ zum Standardrahmen.

Unten: 16 Punkte. Auch dieser Abstand gilt relativ zum Standardrahmen. Dieser

sieht nach unten aber keinen Rand vor. Damit das Textfeld von allen Rändern

gleich weit entfernt ist, muss hier ein etwas größerer Wert angegeben werden.

Abbildung 15.13 Layoutregeln für das Textfeld

Add 4 Constraints beendet die Eingabe und fügt vier Regeln hinzu. Um auch das

Textfeld gemäß der neuen Regeln korrekt zu platzieren, klicken Sie nochmals auf

den Button Resolve Auto Layout Issues und führen dort das Kommando Selected

Views •Update Frames aus.

Damit sollten nun beide Steuerelemente korrekt angeordnet sein. Ändern Sie nun

in der Fußleiste des Storyboard-Editors das iOS-Device und die Ausrichtung. Der Ort

und die Größe der Steuerelemente sollten nun immer korrekt an die jeweilige Bild-

schirmgröße angepasst werden (siehe Abbildung 15.14).

388

Page 57: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.5 Layout optimieren

Abbildung 15.14 Die Hello-World-App im iPhone-7-Plus-Querformat

Wenn es Probleme gibt

Der Umgang mit Layoutregeln ist schwierig und führt häufig dazu, dass sich

Xcode über fehlende oder über zueinander im Konflikt stehende Regeln beklagt. In

Abschnitt 16.5, »Auto Layout«, folgt eine Menge weiterer Details zu diesem Thema.

Bis dahin vertröste ich Sie hier mit einigen Tipps:

Sobald Sie eine Regel für ein Steuerelement festlegen, müssen Sie die Größe und

Position des Steuerelements vollständig durch Regeln bestimmen. Mit anderen

Worten: Solange es gar keine Regeln gibt, betrachtet Xcode das Steuerelement

als unbestimmt und meckert nicht. Sobald Sie aber beginnen, Regeln festzulegen,

müssen Sie dies so tun, dass keine Unklarheiten verbleiben.

Die Anzahl der erforderlichen Regeln ist nicht bei jedem Steuerelement gleich.

Manche Steuerelemente können ihre optimale Größe aus dem Inhalt selbst ermit-

teln. Das trifft z. B. bei einem Button zu. Hier reichen also Regeln, die die Position

festlegen. Bei anderen Steuerelementen müssen Sie die Größe selbst einstellen –

und das erfordert zwei weitere Regeln.

Sie können vorhandene Regeln nicht ohne Weiteres ändern. Die Dialoge Add New

Alignment Constraints bzw. Add New Constraints ersetzen bzw. verändern

nicht vorhandene Regeln, sondern definieren zusätzliche Regeln. Das führt oft zu

Regeln, die sichwidersprechen. EinenÜberblick über alle Regeln erhalten Sie, wenn

389

Page 58: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Sie die Seitenleiste des Storyboard-Editors einblenden (Editor • ShowDocument

Outline). Dort finden Sie eine Liste aller Constraints. Wenn Sie eine der Regeln

anklicken, wird die betreffende Regel markiert.

Bei kleinen Projekten ist es bei Problemen oft am einfachsten, alle Regeln zu

löschen und noch einmal von vorne zu beginnen. Dazu klicken Sie auf den Button

Resolve Auto Layout Issues und führen All Views in View Controller •Clear

Constraints aus.

15.6 Textgrößemit einem Slider einstellen

Als letzte Erweiterung für das Programm fügen wir diesem nun neben dem Button

noch einen Slider hinzu, mit dem die Schriftgröße des Textfelds verändert werden

kann (siehe Abbildung 15.15).

Abbildung 15.15 Die Hello-World-App mit einem Slider zur Einstellung der Textgröße

Das Slider-Steuerelement hinzufügen

Sie finden das Steuerelement in der Xcode-Objektbibliothek unter demNamen Slider.

Zur Positionierung stellen Sie zuerst mit dem Pin-Button die horizontalen Abstände

ein: Der linke Abstand zum HelloWorld-Button soll 24 Punkte betragen, der rechte

390

Page 59: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.6 Textgröße mit einem Slider einstellen

Abstand zum Rand 0 Punkte. Definieren Sie aber keine Regeln für die vertikale Posi-

tion!

In einem zweiten Schritt markieren Sie nun mit (ª) sowohl den Hello World-

Button als auch den Slider. Mit dem Align-Button öffnen Sie dann den Dialog New

Add Align Constraints und wählen dort die Option Vertical Centers. Diese Regel

bewirkt, dass der Button und der Slider vertikal mittig angeordnet werden, was in die-

sem Fall harmonisch aussieht. Über den Button Resolve Auto Layout Issues führen

Sie nun das Kommando Selected Views •Update Frames aus, damit der Slider im

Storyboard-Editor an der richtigen Stelle angezeigt wird.

Mit dem Slider soll die Textgröße in einem Bereich zwischen 12 und 30 Punkt ver-

ändert werden. Dazu wählen Sie den Slider aus und stellen im Attributinspektor die

folgenden Eigenschaften ein:

Minimum: 12

Maximum: 30

Current: 16

Den Slider mit einer Methode verbinden

Damit sind dieArbeiten an derOberfläche abgeschlossen, undwir könnenunswieder

der Programmierung zuwenden: Öffnen Sie den Assistenz-Editor, und verschieben

Sie den Slider mit (ctrl) in den Code-Bereich. Die Verbindungsparameter stellen Sie

wie folgt ein:

Connection = Action: Wir wollen in einer Methode auf das Verschieben des Sli-

ders reagieren.

Name: Die Methodemuss einen Namen bekommen. Ich habe mich für sliderMove

entschieden.

Type = UISlider: In der Methode müssen wir die aktuelle Position des Sliders

herausfinden. Deswegen soll die Instanz des Sliders an die Methode übergeben

werden.

Event =Value Changed: Die Defaulteinstellung passt hier gut – andere Ereignisse

interessieren uns nicht.

Arguments = Sender: Damit wird die Instanz des Sliders als Parameter an die

Methode übergeben. Den Datentyp des Parameters haben wir ja bereits mit

UISlider festgelegt.

Zu Testzwecken bauen wir in die Methode vorerst nur die print-Funktion ein, um

eine Veränderung des Sliders in Xcode verfolgen zu können. Uns interessiert die

value-Eigenschaft, die die Slider-Position im eingestelltenWertebereich als Fließkom-

mazahl liefert.

391

Page 60: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

// wird bei jeder Slider -Bewegung ausgef ührt

@IBAction func sliderMove (_ sender : UISlider ) {

// Testausgabe im Debug -Fenster

print (sender .value)

}

Jetzt geht es nur noch darum, die Schrift des Textfelds entsprechend zu verändern.

Dazu lesen wir mit textView.font? die aktuelle Font-Instanz aus, bilden daraus mit

der Methode withSize eine neue Instanz in der gewünschten Größe und weisen

diese der font-Eigenschaft des Textfelds wieder zu. Da fontWithSize einen CGFloat-

Parameter erwartet, muss die Fließkommazahl von sender.value in den CGFloat-Typ

umgewandelt werden. CGFloat ist auf 32-Bit-Architekturen ein Float, auf 64-Bit-

Architekturen aber ein Double.

@IBAction func sliderMove (_ sender : UISlider ) {

textView .font =

textView .font?.withSize (CGFloat (sender .value ))

}

15.7 Apps auf dem eigenen iPhone/iPadausführen

Den iOS-Simulator in Ehren, aber natürlichwollen Sie Ihre Programmeauch auf »rich-

tiger« Hardware testen. Während dazu früher ein kostenpflichtiger Apple-Developer-

Account erforderlich war, ist das Ausführen eigener Apps auf eigenen Geräten seit

Mitte 2015 kostenlos möglich (»Free Provisioning«). Dazu verbinden Sie im Dialog

Preferences •Accounts Xcode mit Ihrer Apple ID. Außerdem muss Ihr iOS-Gerät

durch ein USB-Kabel mit dem Computer verbunden sein. Nach diesen Vorbereitungs-

arbeiten können Sie das iOS-Gerät in der Symbolleiste von Xcode auswählen.

Wenn Sie (Š)+(R) drücken bzw. den Run-Button anklicken, überträgt Xcode die Hello-

World-App auf das angeschlossene iPhone oder iPad und startet sie dort. Das gelingt

nur, wenn Ihr Smartphone oder Tablet entsperrt ist. Wenn also eine Ziffern- oder

Fingerabdruck-Sperre aktiv ist,müssen Sie dasGerät zuerst einschalten, bevor Sie Ihre

App in Xcode starten. Bemerkenswert ist, dass trotz der externen Programmausfüh-

rung die Debugging-Funktionen von Xcode aktiv bleiben. Wenn Sie also z. B. einen

Breakpoint setzen, wird die App an dieser Stelle angehalten. Sie können in Xcode den

Zustand der Variablen ergründen und das Programm dann wieder fortsetzen.

Die App bleibt jetzt auf dem iPhone oder iPad. Sie kann dort losgelöst von Xcode aus-

geführt werden – dann aber ohne Debugging-Möglichkeiten. Sie können Ihre App wie

jede andere installierte App problemlos wieder löschen, indem Sie sie zuerst länger

anklicken und dann auf das x-Symbol drücken.

392

Page 61: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.7 Apps auf dem eigenen iPhone/iPad ausführen

Einschränkungen des Free Provisioning

Apple bezeichnet das Verfahren zum Ausführen von Apps auf iOS-Geräten ohne

Apple-Developer-Account als Free Provisioning. Dabei gibt es aber Einschränkungen:

Der Test von einigen Zusatzfunktionen erfordert weiterhin einen kostenpflichtigen

Apple-Developer-Account. Das gilt z. B. für In-App-Käufe, den Datenaustauschmit der

iCloud oder die Verwendung der Apple-Pay-Funktionen.

Apple Developer Program

Bevor Sie eine App in den App Store hochladen können, müssen Sie Ihre App spezi-

ell vorbereiten und signieren (siehe Kapitel 29, »App Store und Co.«). Das ist nur mit

dem Schlüsselsystem des Apple Developer Program möglich. Die Mitgliedschaft hat

auch andere Vorteile – etwa den unkomplizierten Zugang zu Beta-Versionen von iOS,

macOS und Xcode, den Zugang zu Entwicklerforen etc.:

https://developer.apple.com/programs

Dieses Service-Paket lässt sichApplemit zurzeit 100 EURpro Jahr bezahlen. ImGegen-

satz zu früher, als es verschiedene Entwicklerprogramme für iOS, macOS und Safari

gab, hat Apple diese Programme nun zu einem einzigen verbunden.

Eine vorhandene oder eine neue Apple-ID verwenden?

Bevor Sie sich dem Entwicklerprogramm anschließen, müssen Sie sich überlegen,

welche Apple-ID Sie hierfür verwenden. Normalerweise spricht nichts gegen Ihre

gewöhnliche Apple-ID. Sollten Sie diese ID aber schon im Rahmen von iTunes Connect

zum Verkauf von Musik oder Büchern nutzen, dann benötigen Sie eine zweite Apple-

ID für das Entwicklerprogramm.

Sie können dem Entwicklerprogramm wahlweise als Einzelperson oder als Team

beitreten. Als Einzelperson benötigen Sie dazu lediglich eine Kreditkarte. Nach

Abschluss des Bezahlprozesses kann es ein paar Minuten dauern, bis Ihr Entwickler-

zugang freigeschaltet wird und Sie die entsprechendeWelcome-E-Mail erhalten.

Nun können Sie in den Xcode-Einstellungen im Dialogblatt Accounts mit Add

Apple ID Ihre Apple-ID mit Xcode verbinden. Von dort gelangen Sie mit View

Details in einen weiteren Dialog, in dem Sie Schlüssel generieren können (siehe

Abbildung 15.16). Vorerst benötigen Sie lediglich einen Schlüssel zur iOS-Entwicklung

(also den Eintrag iOS Development).

Nach diesen Vorbereitungsarbeiten können Sie nun ein mit einem USB-Kabel ange-

schlossenes iOS-Gerät in der Symbolleiste von Xcode auswählen. Das Gerät wird

damit in das Entwicklungsprogramm aufgenommen. Insgesamt dürfen Sie pro Jahr

393

Page 62: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

maximal 500 Geräte mit Ihrem Konto verbinden: 100 iPhones, 100 iPods, 100

iPads sowie je 100 Apple-TV- und Apple-Watch-Geräte. Einen Überblick über alle mit

Ihrem Konto verbundenen iOS-Geräte finden Sie auf der Webseite des Entwicklerpro-

gramms:

https://developer.apple.com/account/ios/device

Abbildung 15.16 Verwaltung der Schlüssel des iOS-Entwicklerprogramms in Xcode

15.8 Komponentenund Dateien eines Xcode-Projekts

Wenn Sie in Xcode ein neues iOS-Projekt starten, besteht dieses standardmäßig schon

aus einer Menge Dateien (siehe Abbildung 15.17) – und dabei bleibt es nicht. Dieser

Abschnitt gibt Ihnen einen kurzen Überblick darüber, welche Datei welchen Zweck

hat. Detaillierte Erläuterungen zu vielen Dateien folgen dann in den weiteren Kapi-

teln.

AppDelegate.swift enthält Code zur Verarbeitung von Ereignissen des App-Lebens-

zyklus (siehe Abschnitt 16.4, »Phasen einer iOS-App«).

394

Page 63: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15.8 Komponenten und Dateien eines Xcode-Projekts

LaunchScreen.xib enthält eine spezielle Ansicht der App, die während des Starts

als eine ArtWillkommensdialog angezeigt wird (sieheAbschnitt 29.1, »iOS-Artwork

(Icons, Launch Screen)«).

Assets.xcassets dient als Container für die Bilddateien der App. Dazu zählen

neben dem Icon der App auch alle anderen Bitmaps, die Sie irgendwann anzeigen

möchten. Die Besonderheit von Xcassets-Dateien besteht darin, dass Bitmaps in

mehreren Auflösungen gespeichert werden können. Bei der Ausführung verwen-

det iOS dann automatisch die Datei, die am besten zum Display des iOS-Geräts

passt (siehe Abschnitt 16.8, »Image-Views und Xcassets« und in Abschnitt 29.1,

»iOS-Artwork (Icons, Launch Screen)«).

Info.plist enthält diverse Projekteinstellungen in Form einer sogenannten Prop-

erty List (Key-Value-Datei).

Main.storyboard beschreibt das Aussehen und die Eigenschaften der Ansichten

(View-Controller) einer App.

ViewController.swift enthält den Controller-Code der ersten Ansicht des Story-

boards. Für jede weitere Ansicht im Storyboard müssen Sie in der Regel eine

weitere Swift-Datei hinzufügen, die eine von UIViewController abgeleitete Klasse

definiert (siehe Kapitel 17, »iOS-Apps mit mehreren Ansichten«).

Abbildung 15.17 Überblick über die Code-Dateien im Projektnavigator von Xcode

Dateien im Navigator verschieben

Sie können die Dateien des Projekts im Navigator verschieben und in Gruppen glie-

dern. Zwei Dinge sind in diesem Zusammenhang bemerkenswert: Zum einen spielt

es für Xcode keine Rolle, in welcher Gruppe die Dateien sich befinden. Xcode fin-

det in jedem Fall alle zum Kompilieren erforderlichen Dateien. Und zum anderen

sind Gruppen keine Unterverzeichnisse im Projektverzeichnis. Gruppen helfen bei der

Organisation der Dateien, haben aber keinen Einfluss darauf, wo Dateien tatsächlich

gespeichert werden. Der Projektnavigator ist also kein Abbild des Dateisystems!

395

Page 64: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

15 Hello iOS-World!

Weitere Dateien

Bei »richtigen« Apps, die also nicht nur Test- oder Beispielcharakter haben, kommen

zu den anfänglich vorhandenen Dateien zumeist viele Dateien hinzu:

Weitere Swift-Code-Dateien verbinden Objekte Ihrer Oberfläche mit eigenen Klas-

sen bzw. bilden die innere Logik Ihres Programms ab, also das Datenmodell gemäß

des MVC-Musters (siehe Abschnitt 16.1, »Model-View-Controller (MVC)«).

Zusätzliche Lokalisierungsdateien enthalten Zeichenketten für alle Sprachen, in

denen die App später ausgeführt werden kann (siehe Abschnitt 29.4, »Mehrspra-

chige Apps«).

Ja nach Zielsetzung der App sind außerdem Text-, XML-, HTML-, Datenbank- sowie

Audio- und Video-Dateien erforderlich. Diese Dateien werden zusammen mit der

App ausgeliefert (»Bundle-Dateien«).

Test- und Produktgruppe

Neben der eigentlichen Projektgruppe, deren Namemit dem Projektnamen überein-

stimmt, kann ein Projekt bis zu drei weitere Gruppen aufweisen:

projektnameTests und projektnameUITests enthält Code und Einstellungen zum

automatisierten Test Ihres Projekts. Das zugrunde liegende XCTest-Framework hat

eine ähnliche Zielsetzung wie Unit Tests in anderen Programmiersprachen. In die-

sem Buch gehe ich darauf allerdings nicht ein.

Products enthält das kompilierte Programm. Bei der iOS-App-Entwicklung werden

die hier enthaltenen Dateien aber selten benötigt, weil die Ausführung von Apps

durch Xcode automatisiert ist und eine Weitergabe von Apps an andere Benutzer

nur über den App Store möglich ist.

396

Page 65: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Kapitel 37

Breakout

Breakout ist ein klassisches Spielhallenspiel. Es geht darum, mit einem Ball recht-

eckige Steine (Bricks) abzuschießen. Es ist Aufgabe des Spielers, den Ball mit einem

Schläger (Paddle) in dem nach unten offenen Spielfeld zu halten. Die erste Version

des Spiels wurde 1976 von Atari produziert, wobei die Spiellogik nicht durch ein Pro-

gramm, sondern in Hardware realisiert wurde.

Abbildung 37.1 Das Spiel »Breakout«

Breakout hat übrigens schon seit Langem mit Apple zu tun: Steve Jobs, der damals

für Atari arbeitete, überließ es Steve Wozniak, einen Prototyp für das Spiel zu bauen,

bezahlte ihn dafür aber nur schäbig. Nichtsdestotrotz gründeten die beiden wenig

später Apple.

https://de.wikipedia.org/wiki/Breakout_(Computerspiel)

1065

Page 66: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37 Breakout

Aus Entwicklersicht ist Breakout ein dankbares Beispiel für den Einstieg in die

Spieleprogrammierung (siehe auch Kapitel 27, »SpriteKit«): Die hier präsentierte

Version umfasst nur rund 250 Zeilen, wenn man den Begleit-Code wegrechnet

(CGOperators.swift, GameViewController.swift etc.).

37.1 Programmaufbau

Die App wurde aus dem Standard-Template für iOS-SpriteKit-Spiele entwickelt. Die

wichtigsten Dateien sind:

GameScene.sks enthält die farbige Hintergrund-Bitmap für die einzige Spielszene.

GameScene.swift enthält den Großteil des Codes.

GameViewController.swift lädt und skaliert die GameScene-Datei.

CGOperators.swift enthält Methoden und Operatoren zum eleganteren Umgang

mit CGXxx-Strukturen (siehe Abschnitt 7.3, »CGFloat, CGPoint, CGSize und Co.«).

Das Spiel kann nur im Portrait-Modus gespielt werden. Andere Geräteausrichtungen

wurden für das iPhone in den Projekteinstellungen deaktiviert bzw. für das iPad in

Info.plist gelöscht (Key Supported interface orientations (iPad)).

In Abbildung 37.1 ist Ihnen vielleicht aufgefallen, dass unterhalb des Schlägers relativ

viel freier Platz ist. BeimTest des Programmshat es sich als praktisch erwiesen, diesen

Platz für die Spielsteuerung frei zu lassen. Das ermöglicht die Steuerung des Schlägers

mit einem Finger, ohne dass der Finger den Schläger verdeckt.

SpriteKit-Funktionen

Mit Ausnahme der Hintergrund-Bitmap verwendet die App keine Sprites, sondern

nur Shapes (also SKShapeNode-Objekte). Die App nutzt die Physik-Engine: einerseits

zur Berechnung der Flugbahn des Balls, andererseits zur Erkennung von Kollisionen

mit Steinen. Diese werden dann aus dem Spielfeld entfernt. Es gibt keine Aktionen

(SKAction-Animationen).

Erweiterungsideen

In dem Spiel gibt es nur einen Level und nur ein Leben. Wenn der Ball aus dem Spiel-

feld fliegt, wird das Spiel bei der nächsten Berührung des Bildschirms neu gestartet.

Wenn Sie Spaß an der App haben, können Sie diverse Erweiterungen programmieren:

Counter mit Highscore-Speicherung

Verwaltungmehrerer Leben

Gestaltung weiterer Level, wobei die Steine abwechslungsreicher angeordnet wer-

den können (z. B. pyramidenförmig)

1066

Page 67: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37.2 Initialisierung

Level mit einem zweiten Ball, der zwischen Steinen eingeschlossen ist und erst

aktiv wird, wenn er »befreit« wird

nachrückende Steine (d. h., alle 30 Sekunden kommt oben eine zusätzliche Stein-

reihe hinzu; noch vorhandene Steine werden nach unten verschoben)

zunehmende Ballgeschwindigkeit im Spielverlauf

37.2 Initialisierung

In der Methode viewDidLoad des View-Controllers wird die Spielszene geladen. Die

Breite der Szene wird aus GameScene.sks übernommen (640 Punkt). Die Höhe wird

so angepasst, dass sie den Proportionen des iOS-Geräts entspricht.

// Projekt ios-breakout

// Datei GameViewController .swift

override func viewDidLoad () {

super .viewDidLoad ()

// Initialisierung des Zufallszahlengenerators

srand48 (Int(arc4random_uniform (100000000) ))

// Spielszene laden

if let scene = GameScene (fileNamed :"GameScene ") {

let skView = self.view as! SKView

scene.scaleMode = .aspectFill

scene.size = CGSize (width: scene .size.width ,

height : scene.size.width /

skView .bounds .width *skView .bounds .height )

skView .presentScene (scene)

}

}

Control Center verbergen

Unter iOS können Sie durchdasHinaufstreichen amunteren Bildschirmranddas Con-

trol Center öffnen. Ganz lässt sich das nicht verhindern – aber wenn die Eigenschaft

prefersStatusBarHidden den Zustand true zurückgibt, dann wird ein versehentliches

Öffnen des Control Centers zumindest wesentlich unwahrscheinlicher.

override var prefersStatusBarHidden : Bool {

return true

}

1067

Page 68: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37 Breakout

Statusvariablen

GameScene.swift beginnt mit der Deklaration einiger Variablen, die die Eckdaten des

Spiels bzw. Spielfelds zusammenfassen:

// Projekt ios-breakout

// Datei GameScene .swift

class GameScene : SKScene {

// Objekte

var paddle : SKShapeNode !

var ball: SKShapeNode !

var label = SKLabelNode (fontNamed : "AvenirNext -Bold")

var w:CGFloat = 0 // enthält Breite und Höhe des SKScene -

var h:CGFloat = 0 // Objekts , wird in didMove eingestellt

// Spielstatus

var brickcounter = 0

var status = GameStatus .waitForStart

}

Der aktuelle Spielstatus wird in status gespeichert. Diese Variable kann die Werte der

folgenden Enumeration annehmen:

enum GameStatus {

case waitForStart , running , won, lost

}

Für die Kollisionserkennung sind am Ende von GameScene.swift außerdem in der

Struktur PhysCategory einige UInt32-Konstanten definiert:

struct PhysCategory {

static let none:UInt32 = 0

static let ball:UInt32 = 1

static let paddle:UInt32 = 2

static let brick:UInt32 = 4

static let frame:UInt32 = 8

}

Der gesamte weitere Code befindet sich innerhalb der Klasse GameScene.

Initialisierung der Spielszene

didMove wird zum Einrichten der Spielszene ausgeführt. Der Code sollte ohne weitere

Erklärungen verständlich sein:

1068

Page 69: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37.2 Initialisierung

override func didMove (to view: SKView ) {

w = self.frame.width

h = self.frame.height

// keine Gravitation

self.physicsWorld .gravity = CGVector .zero

// zur Erkennung , wann ein Ball einen Stein trifft

self.physicsWorld .contactDelegate = self

// Spielobjekte zusammenstellen

setupBricks (rows: 6, cols: 6)

setupPaddle ()

setupBall ()

setupText () // für 'Game Over '

// Ball in Spielraum einsperren

self.physicsBody = SKPhysicsBody (edgeLoopFrom : self.frame)

with(self.physicsBody !) {

$0.categoryBitMask = PhysCategory .frame

$0.collisionBitMask = PhysCategory .ball

$0.contactTestBitMask = PhysCategory .none

}

}

Umbei der Einstellung der Eigenschaften des physikalischen Körpers die wiederholte

Nennung von brick.physicsBody! zu vermeiden, habe ich die with-Funktion verwen-

det, die schon in Abschnitt 27.7, »Kollisionserkennung«, vorkam. Sie ist am Ende von

GameScene.swift deklariert:

func with <T>(_ object : T, closure : (T) ->()) {

closure (object )

}

Spielsteine einrichten

setupBricks richtet rows Zeilen mit jeweils cols Steinen ein. In brickcounter wird die

Gesamtanzahl der Steine gespeichert. Die Variable hilft später dabei, das Spielende zu

erkennen. Die Steine werden je nach Zeile in unterschiedlichen Rottönen eingefärbt.

Außerdem wird jeder Stein durch name = "brick" benannt. Das ermöglicht es später,

alle Steine unkompliziert aus der Spielszene zu löschen.

isDynamic = false schließt aus, dass sich die Steine bewegen. Die weiteren physics-

Body-Eigenschaften bewirken, dass der Ball von den Steinen abprallt und dass die

contactDelegate-Methode didBegin bei jeder Kollision aufgerufen wird.

1069

Page 70: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37 Breakout

func setupBricks (rows: Int, cols: Int) {

let brickw = w / CGFloat (cols+1)

let brickh = brickw / 3

brickcounter = rows * cols

for row in 1...rows {

let brickColor =

SKColor .init(red: 0.7 + 0.3 * CGFloat (rows - row) /

CGFloat (rows),

green : 0.2 ,

blue: 0,

alpha : 1)

for col in 1...cols {

let brick = SKShapeNode (rectOf :

CGSize (width: brickw * 0.95 , height : brickh * 0.7))

brick.fillColor = brickColor

brick.strokeColor = brickColor

let x = brickw * CGFloat (col)

let y = h - brickh * CGFloat (row+1)

brick.position = CGPoint (x: x, y: y)

brick.zPosition = 10

brick.name = "brick"

self.addChild (brick)

brick.physicsBody =

SKPhysicsBody (rectangleOf : brick.frame.size)

with(brick.physicsBody !) {

$0.isDynamic = false

$0.categoryBitMask = PhysCategory .brick

$0.contactTestBitMask = PhysCategory .ball

$0.collisionBitMask = PhysCategory .ball

}

} // Ende for col

} // Ende for row

} // Ende func

Geschwindigkeitsüberlegungen

Die Anzahl der Spielsteine hat bei diesem Spiel einen großen Einfluss auf den Rechen-

aufwand. Bei jedem Frame muss SpriteKit für jeden Spielstein überprüfen, ob dieser

mit dem Ball kollidiert. Das verursacht angesichts der einfachen Objektformen einen

verblüffend hohen CPU-Aufwand.

1070

Page 71: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37.2 Initialisierung

Ich habe das Spiel auf einem iPhone 5S mit 16� 16 Steinen getestet. Dabei sank die

Frame-Rate auf ca. 20. Sie wurde auch nicht höher, als ich den Ball ins Aus laufen ließ,

sich also sämtlicheObjekte imRuhezustandbefanden. SpriteKit ist hier offensichtlich

schlecht optimiert.

Wenn Sie also eine Profiversion von Breakout programmierenmöchten, sollten Sie auf

die Verwendung der Physik-Engine verzichten und die Kollisionsberechnungen selbst

durchführen. Das ist nicht besonders schwierig und lässt sich für die simple Spielidee

sicherlich effizienter gestalten, als dies in SpriteKit der Fall ist.

Schläger einrichten (Paddle)

Der Schläger ist einfach einweiteres SKShapeNode-Objekt, das imuntersten Bildschirm-

viertel platziert wird. Damit der Ball vom Schläger abprallt, ist ein physikalischer

Körper erforderlich. Gleichzeitig soll der Schläger aber nicht durch die Regeln der Phy-

sik bewegt werden, sondern ausschließlich durch den Finger auf dem Display. Daher

ist isDynamic = false erforderlich. Die BitMask-Einstellungen stellen sicher, dass der

Ball vom Schläger abprallt, dass SpriteKit aber keine weiteren (rechenaufwendigen)

Kollisionsdetektoren aktiviert.

func setupPaddle () {

// Paddle unten positionieren ,

// Breite ist 1/5 der Bildschirmbreite

paddle = SKShapeNode (

rectOf : CGSize (width : w * 0.20 ,

height : w * 0.04) )

paddle .fillColor = SKColor .red

paddle .strokeColor = SKColor .red

paddle .position =

CGPoint (x: w * 0.5 , // mittig

y: h * 0.2) // unteres Viertel

paddle .zPosition = 10

self.addChild (paddle )

paddle .physicsBody =

SKPhysicsBody (rectangleOf : paddle .frame.size)

with(paddle .physicsBody !) {

$0.isDynamic = false

$0.categoryBitMask = PhysCategory .paddle

$0.collisionBitMask = PhysCategory .ball

$0.contactTestBitMask = PhysCategory .none

}

}

1071

Page 72: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37 Breakout

Ball einrichten

Der Ball ist ein kreisförmiges SKShapeNode-Objekt. Er wird vertikal etwas oberhalb des

Schlägers positioniert. Die horizontale Position ist vom Zufall abhängig.

Den physikalischen Körper wollte ich ursprünglich rund einrichten (also mit

SKPhysicsBody(circleOfRadius ...)), das hat sich aber nicht bewährt. Es kommt dann

recht oft vor, dass der Ball auf die Ecke eines Steins trifft und in einem sehr flachen

Winkel abprallt. Dasmag physikalisch korrekt sein, der Effekt ist aber unvorhersehbar

und dem Spiel nicht dienlich. Deswegen habe ich den physikalischen Körper einfach

quadratisch gewählt.

Bei der Einstellung der physikalischen Eigenschaften ist es wichtig, jede Form der Rei-

bung oder Dämpfung zu deaktivieren – sonstwird der Ball immer langsamer. Der Ball

soll von allen anderen Körpern abprallen. Eine Kollisionsbenachrichtigung ist aber

nur beim Zusammentreffen mit einem Stein erforderlich.

func setupBall () {

ball = SKShapeNode (circleOfRadius : w/35)

ball.fillColor = SKColor .black

ball.strokeColor = SKColor .black

ball.position = CGPoint (x: w * 0.25 + w * 0.5 * cRnd() ,

y: h*0.3)

ball.zPosition = 10

self.addChild (ball)

ball.physicsBody = SKPhysicsBody (rectangleOf : ball.frame.size)

with(ball.physicsBody !) {

$0.friction = 0

$0.angularDamping = 0

$0.linearDamping = 0

$0.restitution = 1

$0.allowsRotation = false

$0.categoryBitMask = PhysCategory .ball

$0.collisionBitMask = PhysCategory .brick +

PhysCategory .frame +

PhysCategory .paddle

$0.contactTestBitMask = PhysCategory .brick

}

}

Der Ball ist anfänglich in Ruhe – er wird erst durch die Berührung des Displays in den

touches-Methoden in Bewegung gesetzt.

1072

Page 73: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37.3 Spielsteuerung

37.3 Spielsteuerung

Die touchesBegan-Methode ist für den Start des Spiels verantwortlich. Beim ersten

Spiel mit status == .waitForStart ist das Spielfeld bereits eingerichtet. Daher reicht

es aus, den Ball mit applyImpulse in Bewegung zu setzen.Wenn dagegen vorher schon

eine Runde gespielt wurde, müssen der Ball und die Spielsteine neu eingerichtet

werden.

override func touchesBegan (_ touches : Set <UITouch >,

with event : UIEvent ?)

{

if status == .waitForStart {

// erstes Spiel: Ball in Bewegung setzen

ball.physicsBody !.applyImpulse (initialImpulse ())

status = .running

label.text = ""

} else if status == .won || status == .lost {

// neues Spiel starten : zuerst aufräumen ...

ball.removeFromParent ()

for ch in self.children {

if let childname = ch.name , childname == "brick" {

ch.removeFromParent ()

}

}

// ... dann das Spielfeld neu einrichten

setupBall ()

setupBricks (rows:6, cols:6)

ball.physicsBody !.applyImpulse (initialImpulse ())

status = .running

label.text = ""

self.isPaused = false

}

}

// Startimpuls für den Ball

func initialImpulse () -> CGVector {

return CGVector (dx: w * 0.05 , dy: w * 0.05)

}

Schläger steuern

Um die Steuerung des Schlägers kümmert sich die touchesMoved-Methode. Relevant

ist dabei nur die X-Koordinate des Berührungspunkts. Sie legt die Position des Schlä-

germittelpunktes fest. Die in GCOperators.swift definierte minMax-Funktion stellt

dabei sicher, dass der Schläger nicht über den Bildschirmrand bewegt wird.

1073

Page 74: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37 Breakout

override func touchesMoved (_ touches : Set <UITouch >,

with event : UIEvent ?)

{

if touches .count != 1 { return }

let touch = touches .first!

let xnew = touch.location (in: self).x

let xmin = paddle.frame.size.width /2

let xmax = self.frame.size.width - xmin

paddle .position =

CGPoint (x: minMax (xnew , minimum : xmin , maximum : xmax) ,

y: paddle .position .y)

}

touchesEnded und touchesCancelled sind gemäß den Dokumentationsvorgaben eben-

falls implementiert, enthalten aber keinen Code. Auf den Abdruck habe ich daher

verzichtet.

Test, ob der Ball im Aus ist

In der update-Methode wird getestet, ob die Y-Koordinate des Balls kleiner ist als die

des Schlägers. In diesem Fall ist der Ball im Aus, das Spiel ist verloren und wird pau-

siert.

Ein wenig merkwürdig ist der restliche Code: Während der Tests ist es immer wieder

vorgekommen (circa einmal pro Spiel), dass der Ball von seiner üblichen diagonalen

Flugbahn abwich und sich gänzlich horizontal bzw. vertikal bewegte. Ein vernünfti-

ges Spiel ist dann nicht mehr möglich. Wenn das passiert, die X- oder Y-Komponente

der Geschwindigkeit also nahe 0 ist, wird die Geschwindigkeit ganz auf 0 zurück-

gesetzt. Anschließend erhält der Ball wieder seinen Startimpuls. Diese Maßnahme

klingt recht radikal, ist aber im Spielverlauf optisch nicht wahrnehmbar.

override func update (_ currentTime : TimeInterval ) {

if status != .running { return }

// Test , ob das Spiel verloren ist

if ball.position .y < paddle .frame .minPoint ().y {

label.text = "Game Over"

self.isPaused = true

status = .lost

return

}

// manchmal passiert es, dass der Ball sich nur noch

// horizontal oder vertikal bewegt ; dann muss man

// der Physik ein wenig nachhelfen

1074

Page 75: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

37.3 Spielsteuerung

if abs(ball.physicsBody !.velocity .dx) <= 0.01 ||

abs(ball.physicsBody !.velocity .dy) <= 0.01

{

ball.physicsBody !.velocity = CGVector .zero

ball.physicsBody !.applyImpulse (initialImpulse ())

}

}

Kollisionserkennung

Wenn der Ball einen Stein trifft, wird die Methode didBegin des SKPhysicsContact-

Delegate-Protokolls aufgerufen. In der Methode verweist dann contact.bodyA oder

contact.BodyB auf diesen Stein. Er wird einfach entfernt. (Wenn Sie möchten, können

Sie hier eine nette Animation einbauen, die den Stein explodieren oder in sich zusam-

menfallen lässt.)

Sollte die Anzahl der Steine damit auf 0 sinken, hat der Spieler bzw. die Spielerin das

Spiel gewonnen.

extension GameScene : SKPhysicsContactDelegate {

func didBegin (_ contact : SKPhysicsContact ) {

var brick :SKNode !

if contact .bodyA.categoryBitMask == PhysCategory .brick {

brick = contact .bodyA.node

} else if contact .bodyB.categoryBitMask == PhysCategory .brick

{

brick = contact .bodyB.node

} else {

return

}

// Stein entfernen

brick.removeFromParent ()

// Spielende ?

brickcounter -= 1

if brickcounter == 0 {

label.text = "Congratulations !"

self.isPaused = true

status = .won

}

}

}

1075

Page 76: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226
Page 77: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

Index

&-Zeichen (inout-Parameter) ............................ 144

_-Zeichen (Wildcard-Pattern) ............................... 72

A

AAC-Format ................................................................... 733

abs-Funktion ................................................................ 148

Abstand zwischen zwei Koordinaten-punkten ................................................................. 963

Accelerometer ............................................................. 798

accelerometerUpdateInterval-Eigen-schaft ....................................................................... 800

acceptsFirstResponder-Eigenschaft .............. 548

action-Eigenschaft (NSMenuItem) ................ 562

action-ParameteraddTarget ................................................................. 426

Gesture Recognizer ............................................. 933

Actions ................................................................... 377, 399macOS ........................................................................ 502

SpriteKit ..................................................................... 804

umbenennen .......................................................... 382

activateFileViewerSelecting-Methode ...... 1051

Activity-Indictator-View ........................................ 851

adaptivePresentationStyle-Methode ........... 480

add-Methode ................................................................ 169

addAction-Methode ................................................ 490

addButtonWithTitle-Methode .......................... 536

addConstraint-Methode ....................................... 427

adding-Methode ........................................................ 169

addInput-Methode ................................................... 766

addObserver-Methode ................................ 720, 951addOutput-Methode ............................................... 766

addSublayer-Eigenschaft ...................................... 750

addSubview-Methode ...... 426, 516, 1021, 1054addTarget-Methode ................................................. 426

Adjust-Scroll-View-Insets-Option ................... 919

afconvert-Kommando ........................................... 733

affectedByGravity-Eigenschaft ......................... 831

Aktionen (SpriteKit) ................................................. 804Aktuelles Verzeichnis ermitteln/ändern .... 614

Alert-Dialog ................................................................... 489

alertStyle-Eigenschaft ............................................ 536

Align-Button ................................................................. 413

alignment-Eigenschaft .......................................... 679

Stack-View ................................................................ 429

allowsRotation-Eigenschaft ................................ 831

alpha-Eigenschaft ........................................ 728, 1119SpriteKit ..................................................................... 787

alternate-Eigenschaft .............................................. 542

Ambiguous Use of Function (Fehler-meldung) ............................................................... 136

anchorPoint-Eigenschaft ........................ 787, 1088angularDamping-Eigenschaft ............. 831, 1072angularVelocity-Eigenschaft .............................. 831

animate-Methode ........................................ 725, 1021animate-Methode (SpriteKit-

Aktionen) ................................................. 807, 1098Animationen ................................................................ 725

im Spiel 5-Gewinnt ............................................ 1021

Any-Datentyp ............................................................... 315

AnyClass-Datentyp ................................................... 316

AnyObject-Datentyp ............................................... 315

API-Design-Richtlinien .......................................... 143

API-Version testen ..................................................... 116

AppArchiv erzeugen .................................................... 893

auf iOS-Geräten ausführen ............................ 392

beenden ..................................................................... 589

Bundle-Dateien ..................................................... 610

HelloWorld .............................................................. 369

Icon ................................................................. 868, 1037

ID ................................................................................... 889

im App Store einreichen ................................... 893

im Simulator ausprobieren ............................ 374

Lebenszyklus ........................................................... 409

Lokalisierung .......................................................... 877

Name ........................................................................... 869

Sprache ....................................................................... 877

User-Defaults ......................................................... 603

weitergeben (iOS) ................................................. 886

weitergeben (macOS) ........................................ 895

Willkommensbildschirm ................................. 869

App Store ......................................................................... 886

App Transport Security .............................. 649, 923AppDelegate-Klasse ............................................... 1062

Init-Funktion ........................................................... 531

iOS ................................................................................. 409

macOS ......................................................................... 507

Split-View-Controller-Beispiel ....................... 473

appdmg-Kommando .............................................. 898

append-Methode ....................................................... 212

Zeichenketten ......................................................... 194

appendArc-Methode ............................................... 544

appendBezierPathWithRoundedRect-Methode ................................................................ 569

appendingPathComponent-Methode ......... 609

appendingPathExtension-Methode ............. 609

1153

Page 78: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

Apple Developer Program ........................... 24, 393Apple Movie Trailers ............................................... 682

Apple TV .......................................................................... 579

Asteroids-Spiel .................................................... 1127

Pac-Man ................................................................. 1120

tvOS-Grundlagen ................................................. 579

application-Methode .............................................. 410

applicationDidBecomeActive-Methode ..... 410

applicationDidEnterBackground-Methode ................................................................ 410

applicationDidFinishLaunching-Methode ................................................... 508, 1062

applicationWillEnterForeground-Methode ................................................................ 410

applicationWillResignActive-Methode ....... 410

applicationWillTerminate-Methode ........................................ 410, 508, 1062

applyAngularImpulse-Methode ...................... 832

applyForce-Methode ............................................... 832

applyImpulse-Methode .............................. 832, 837applyTorque-Methode ........................................... 832

ARC ...................................................................................... 279

arch-Test .......................................................................... 117

Archiv (Xcode) ............................................................. 893

archiveRootObject-Methode .............................. 947

arguments-Eigenschaft ......................................... 364

Arrays ................................................................................ 207

assoziative ............................................................... 225

auslesen ..................................................................... 211

Doppelgänger entfernen ................................. 224

durchwürfeln .......................................................... 224

filter, map und reduce ....................................... 218

initialisieren ............................................................ 210

mehrdimensionale ................................ 215, 1002

sortieren .................................................................... 213

verändern ................................................................. 212

zweidimensionale ............................................. 1002

ArraySlice-Datentyp ................................................. 211

ArrowView-Klasse (Beispiel) ............................... 953as-Operator ...................................... 79, 295, 297, 328Aspect-Fill-Einstellung ................................ 426, 443Aspect-Fit-Einstellung ................................. 426, 443assert-Funktion .......................................................... 341

Assets.xcassets-Datei .............................................. 441

Assiciated Values ........................................................ 248

associatedtype-Schlüsselwort ........................... 309

associativity-Schlüsselwort ........................... 87, 88Assoziative Arrays ..................................................... 225

Assoziativität ................................................................... 84

Asteroids-Spiel .......................................................... 1127Async-Bibliothek ........................................................ 865

async-Methode ................................................. 635, 852Trailer-Beispiel ............................................ 688, 689

asyncAfter-Funktion .................................. 855, 1003

Asynchrone Programmierung .......................... 849

Asynchroner Download ........................................ 630

Atlas (SpriteKit) ............................................. 806, 1079atomically-Parameter ............................................. 621

ATS (App Transport Security) ............................ 628

attitutde-Eigenschaft .............................................. 801

Attribute .......................................................................... 359

attribute-Methode .................................................... 637

attributesOfFileSystem-Eigenschaft ............. 585

attributesOfItem-Methode ................................. 617

Audio ................................................................................. 731

aufnehmen ............................................................... 744

beschleunigt wiedergeben .............................. 742

Bibliotheken ............................................................ 732

Datei abspielen ..................................................... 733

Formate ..................................................................... 733

SpriteKit-Aktion .................................................... 808

Stream abspielen .................................................. 741

audioRecorderDidFinishRecording-Methode ................................................................. 747

AudioServicesPlaySystemSound-Funktion ................................................................ 740

Aufräumarbeiten durchführen (defer) ........ 134Auto Layout ........................................................ 384, 412

deaktivieren ............................................................ 413

Maßeinheit .............................................................. 412

Regeln durch Code definieren ...................... 426

View-Größe fixieren ............................................ 524

Auto-Fokus (Kamera) .............................................. 773

autoclosure-Attribut ................................................ 159

autoFocusRangeRestriction-Eigenschaft ... 773

Automatic Reference Counting ........................ 279

Autoresizing-Option ............................................... 424

available-Attribut ....................................................... 359

available-Test ................................................................ 116

availableFonts-Methode ....................................... 537

AVAsset-Klasse ............................................................. 740

AVAudioPlayer-Klasse ............................................. 733

AVAudioRecorder-Klasse ....................................... 744

AVAudioRecorderDelegate-Protokoll ............ 747

AVAudioSession-Klasse .......................................... 745

AVCaptureDevice-Klasse ....................................... 764

AVCaptureDeviceDiscoverySession-Klasse ....................................................................... 768

AVCaptureDeviceInput-Klasse .......................... 764

AVCaptureMetadataOutputObjectsDelegate-Protokoll ................................................................ 772

AVCapturePhotoCaptureDelegate-Protokoll ................................................................ 764

AVCapturePhotoOutput-Klasse ............. 764, 772AVCapturePhotoSettings-Klasse ........... 764, 769AVCaptureSession-Klasse ..................................... 764

AVCaptureVideoPreviewLayer-Klasse .......... 764

AVEncoderAudioQualityKey-Konstante ..... 746

1154

Page 79: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

AVFormatIDKey-Konstante ................................. 746

AVFoundation-Bibliothek .................................... 732

AVItem-Klasse .............................................................. 740

AVKit-Bibliothek ........................................................ 732

AVLayerVideoGravityResizeAspect-Konstante .............................................................. 750

AVNumberOfChannelsKey-Konstante ........ 746

AVPlayer-Klasse .......................................................... 740

in einem AVPlayerViewController .............. 742

AVPlayerItemDidPlayToEndTime-Konstante .............................................................. 741

AVPlayerLayer-Klasse .............................................. 750

AVPlayerViewController-Klasse ....................... 742

Video abspielen ..................................................... 749

AVSampleRateKey-Konstante ............................ 746

B

Back-Button ................................................................... 457

Background Capabilities ............................ 696, 737backgroundColor-Eigenschaft

(SpriteKit) ........................................................... 1088Badge-Eigenschaft (Tab-Bar-Item) .................. 464

Bar-Button-Item ......................................................... 458

Barcodes erkennen ................................................... 772

Bechmarktests ............................................................. 206

becomeFirstResponder-Methode ....... 438, 548,939

Beispiel ....................................................................... 959

Bedingte Protokollerweiterungen .................. 325

beginDraggingSession-Methode .................... 565

beginReceivingRemoteControlEvents-Methode ................................................................ 738

Benannte Parameter ............................................... 130

in Protokollen ........................................................ 303

Init-Funktion ........................................................... 264

Beschleunigungsmesser ....................................... 798

Bewegungssteuerung ............................................. 798

Bild herunterladen ................................................... 628

Binäre Datei herunterladen ................................ 628

Binäre Zahlen ............................................................... 168

Binärer Operator ........................................................... 82

BinaryFloatingPoint-Protokoll ......................... 169

bitmapLiteral-Schlüsselwort .............................. 784

Bitmapsals PNG-Datei speichern .................. 1047, 1124

Atlas ............................................................... 806, 1079

erzeugen (macOS) ............................................. 1125

für Sprites .................................................................. 786

Images.xcassets-Datei ........................... 441, 662

Literale ........................................................................ 784

NSImage-Klasse ................................................. 1045

skalieren ................................................................. 1045

UIImage-Klasse ..................................................... 662

Bitweises Rechnen ....................................................... 75

blendMode-Eigenschaft ..................................... 1119

Bodies (SpriteKit) ....................................................... 829bodyA/bodyB-Eigenschaft .................................. 818

Bool-Datentyp ............................................................. 172

Boolesche Werte ......................................................... 172

boolValue-Eigenschaft ........................................... 618

borderColor-Eigenschaft ...................................... 407

borderWidth-Eigenschaft ..................................... 407

bounds-Eigenschaft ... 485, 516, 541, 821, 1024Box2D-Engine .............................................................. 826

break-SchlüsselwortSchleifen .................................................................... 120

switch .......................................................................... 113

brew-Projekt ................................................................. 898

Bridging-Header-Datei ........................................... 361brighter-Methode ................................................... 1002

Bundle-Dateien ........................................................... 610

Bundle-ID ....................................................................... 888

in iTunes Connect ................................................ 891

Bundle-Klasse .............................................................. 610

ButtonsiOS ................................................................................. 373

macOS ...................................................................... 1040

Textured Button ................................................. 1040

buttonWithType-Methode .................................. 426

C

Cache-Verzeichnis ..................................................... 981

Xcode ........................................................................... 909

cachesDirectory-Konstante ................................ 613

CAF-Format ................................................................... 733

CALayer ............................................................................ 750

CALayer-Klasse .............................................. 407, 1021Camera Roll ................................................................... 761cameraDevice-Eigenschaft .................................. 763

canBecomeFocused-Eigenschaft ..................... 592

Asteroids-Spiel .................................................... 1146

in SpriteKit-Apps ................................................... 596

cancelOperation-Methode .................................. 549

canCreateDirectories-Eigenschaft .................. 536

canEditRowAt-Parameter .................................... 938

canMoveRowAt-Parameter ................................. 938

Canvas-Value-Einstellung ..................................... 417

Capabilities ......................................................... 696, 737Maps ............................................................................ 692

capacity-Eigenschaft ............................................... 214

capitalized-Eigenschaft ......................................... 188

Capture List ................................................................... 164

capture-Methode ................................. 764, 769, 772Capture-Session

Barcodes erkennen ............................................. 772

Fotos aufnehmen ................................................. 763

captureOutput-Methode ...................................... 775

1155

Page 80: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

capturePhoto-Methode .............................. 764, 769Capturing Values ....................................................... 162

Carthage .......................................................................... 357

case-Schlüsselwort ................................................... 112

Casting ................................................................... 295, 328catch-Schlüsselwort ...................................... 334, 336categoryBitMask-Eigenschaft ................. 816, 830cellForRow-Parameter ............................................ 654

CG-Kürzel ........................................................................ 722CGColor-Struktur ....................................................... 407

CGContext-Klasse ........................................ 723, 1046CGContextAddArc-Methode .............................. 716

CGContextDrawPath-Methode ........................ 716

CGFloat-Datentyp ...................................................... 174

CGFloat-Typ ................................................................... 392

CGImage-Klasse ....................................................... 1046

CGImageDestination-Klasse ........................... 1047

CGImageDestinationFinalize-Funktion ... 1047

CGMotion-Klasse ....................................................... 803

cgPath-Eigenschaft ................................................... 834

CGPoint-Struktur ............................................ 173, 541erweitern ................................................................... 178

CGRect-Struktur ................................... 173, 541, 679erweitern ................................................................... 177

CGRectMake-Funktion ........................................... 427

CGRectMake-Methode ................................ 679, 993CGSize-Struktur ............................................... 173, 541CGVector-Struktur .................................................... 173

changeCurrentDirectoryPath-Methode ..... 614

changeFont-Methode ............................................. 537

Character-Datentyp ................................................. 181

characters-Eigenschaft ................................ 192, 549CharacterSet-Struktur ............................................ 189

childNode-Methode ................................... 844, 1149children-Eigenschaft ............................................... 329

class-Schlüsselwort ....................................... 240, 272clitToBounds-Eigenschaft .................................... 443

CLLocation-Klasse ..................................................... 963

CLLocationManager-Klasse ..................... 693, 698Kompass .................................................................... 704

teilen ............................................................................ 948

CLLocationManagerDelegate-Protokoll ..................................................... 698, 704

close-Methode ............................................................. 525

Closed-Range-Operator ............................................ 81

closePath-Methode .................................................. 953

Closures ........................................................................... 156

Auto-Closures ......................................................... 159

Capture List ............................................................. 164

Capturing Values ................................................. 162

für Lazy Properties .............................................. 253

Fehler (rethrows) ................................................... 346

in Animationen ..................................................... 725

throws/rethrows ................................................... 348

Trailing Closures ................................................... 157

UIAlert-Beispiel ..................................................... 490

unowned self ................................................ 164, 726

verzögert ausführen ............................. 855, 1003

weak ............................................................................. 164

CMCoreMotionManager-Klasse ...................... 800

CMTime-Struktur ...................................................... 741

Cocoa Touch .................................................................. 403

Cocoa-Framework ..................................................... 494

CocoaPods ...................................................................... 357

YouTube-Beispiel .................................................. 758

Collection-Protokoll ................................................ 326

Collection-View-Steuerelement ....................... 682

Foto-App .................................................................... 771

Hintergrund unsichtbar ................................... 771

collisionBitMask-Eigenschaft ................. 817, 830Color Panel .................................................................... 538

Color Well ....................................................................... 538

color-Eigenschaft ....................................................... 538

SpriteKit ..................................................................... 787

colorBlendFactor-Eigenschaft ........................... 787

command-Eigenschaft .......................................... 542

CommandLine-Enumeration ............................... 37

Comparable-Protokoll ............................................ 314

compare-Methode .................................................... 187

CompassView-Steuerelement (Beispiel) ..... 714Compiler ............................................................................ 40

completion-Parameter ............................. 726, 1032components-Methode ................................ 194, 204

Zeichenketten in Zeilen zerlegen ................ 364

compositingOperation-Eigenschaft .......... 1124

Compound Types ...................................................... 229

Compression Resistance Priority ................... 432

Computed Properties ..................................... 94, 257Extensions ................................................................ 322

Fehler auslösen ...................................................... 345

preferredContentSize ......................................... 483

prefersStatusBarHidden .................................. 432

Vererbung ................................................................. 289

concludeDragOperation-Methode ...... 565, 576Concurrent Queues .................................................. 853

Connections Inspector ................................ 653, 673constrainMaxCoordinate-Parameter ........ 1053

constrainMinCoordinate-Parameter ......... 1053

Constraints (Auto Layout) ......................... 384, 412contactBitMask-Eigenschaft .............................. 816

contactTestBitMask-Eigenschaft ..................... 831

Containment Segues ............................................... 521

contains-Methode ......... 175, 218, 226, 227, 573Content Compression ............................................ 422

Content Compression ResistancePriority ......................................................... 432, 972

1156

Page 81: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

Content Hugging ....................................................... 422

Content Hugging Priority .................................... 972

contentMode-Eigenschafteigene Steuerelemente ...................................... 718

Image View ................................................... 426, 443

contentOverlayView-Eigenschaft ................... 743

contents-Eigenschaft .............................................. 570

contentsOfDirectory-Methode ......................... 615

contentView-Eigenschaft ..................................... 516

continue-Schlüsselwort ........................................ 121

continuousAutoFocus-Enumerations-wert ........................................................................... 773

Control Center (versehentliches Öffnenverhindern) ............................................ 785, 1067

control-Eigenschaft ................................................. 542

Controller ....................................................................... 372

controllers-Eigenschaft ......................................... 803

Convenience Init Function ................................. 265

Vererbung ................................................................. 291

convenience-Schlüsselwort ................................ 265

convert-Methode .............................. 541, 570, 1057Fonts ............................................................................ 538

Copy-on-Write (Zeichenketten) ........................ 184

copyItem-Methode .................................................. 620

Core Graphics ............................................................... 722

Core Location (CL) ..................................................... 693CoreAudio-Bibliothek ............................................. 732

CoreMotion-Bibliothek ......................................... 800

cornerRadius-Eigenschaft .................................... 407

count-Eigenschaft .......................................... 211, 226count-Methode ........................................................... 186

CountableClosedRange-Struktur ....................... 81

CountableRange-Struktur ...................................... 81

Crashlogs ........................................................................ 906

createArray2D-Funktion .................................... 1002

createDirectoryAtPath-Methode .................. 1063

cRnd-Funktion ............................................................ 820

currentDirectoryPath-Eigenschaft ................. 614

currentTime-Eigenschaft ..................................... 741

CustomStringConvertible-Protokoll ............. 311

D

darker-Methode ....................................................... 1002

Data-Klasse .................................................................... 628

Data-Source-Protokoll ............................................ 677

NSTableView ........................................................... 673

UITableView ............................................................ 654

dataSource-EigenschaftNSTableView ........................................................... 673

UIPickerView .......................................................... 990

UITableView ........................................................... 653

date-MethodeCalendar .................................................................... 205

DateFormatter ....................................................... 204

Date-Struktur ............................................................... 203

tvOS-Beispiel ........................................................... 582

dateFormat-Eigenschaft ....................................... 203

DateFormatter-Klasse ............................................. 203

Dateien ............................................................................. 603

auswählen ................................................................ 535

Eigenschaften ermitteln ................................... 617

Größe ermitteln ..................................................... 617

kopieren ..................................................................... 620

löschen ....................................................................... 620

temporäre Datei ................................................... 614

testen, ob Datei existiert .................................. 609

Textdateien lesen/schreiben .......................... 621

URLs ............................................................................. 608

verschieben .............................................................. 620

Dateisystem (Größe ermitteln) ........................ 584

Datenquelle im Connections Inspectoreinstellen .................................................... 653, 673

DatentypenAliasse ......................................................................... 278

ermitteln ............................................................ 79, 328

Funktionstypen ..................................................... 152

Datum ............................................................................... 203

deadline-Parameter ................................... 855, 1003decimalSeparator-Eigenschaft .......................... 987

decodeXxx-Methoden ............................................ 947

default-Schlüsselwort (switch) ......................... 113

defaultManager-Methode ................................. 1062

DefaultPrecedence (Operatoren) ....................... 84

defaults-Kommando ............................................... 607

Defaultwerte für Parameter ............................... 145

defer-Schlüsselwort ................................................. 134

in try-catch-Konstruktionen ......................... 341

Deinit-Funktion ............................................... 268, 279Dekrement-Operator ................................................. 75

delay-Funktion ......................................................... 1003

delegate-EigenschaftAVAudioRecorder .................................................. 747

CLLocationManager .......................................... 698

MKMapView ........................................................... 699

NSApplicationDelegate .................................... 532

NSFontManager ................................................... 537

NSTableView .............................................. 673, 1056

NSWindow ..................................................... 510, 514

UIApplication ......................................................... 411

UIPickerView .......................................................... 990

UIPopoverPresentationController .. 481, 488

UITableView ............................................................ 653

UITapGestureRecognizer ................................ 988

UITextField .................................................... 436, 987

1157

Page 82: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

Delegation ................................................ 301, 400, 435Beispiel für eigenesDelegation-Protokoll ...................................... 964

CLLocationManagerDelegate-Beispiel ... 698

Connections Inspector ........................... 653, 673

NSTableView ................................................. 673, 677

SetPieceDelegate-Beispiel ............................ 1015

UITableView ............................................................ 653

UITextFieldDelegate-Beispiel ........................ 436

Delete-on-Swipe (UITableView) ........................ 938deleteRows-Methode .............................................. 938

deleteXxx-Methoden .............................................. 549

deletingLastPathComponent-Methode ...... 609

deletingPathExtension-Methode ................... 609

density-Eigenschaft ................................................. 830

dequeueReusable-Methode ................................ 654

dequeueReusableCell-Methode ....................... 657

DerivedData-Verzeichnis ...................................... 908

description-Eigenschaft ............................. 311, 946Designated Init Function ..................................... 265

Vererbung ................................................................. 291

desiredAccuracy-Eigenschaft ............................ 698

destination-Eigenschaft ........................................ 452

detailTextLabel-Eigenschaft ............................... 659

Developer Program .......................................... 24, 393Device Orientation ................................................... 799

deviceMotionUpdateInterval-Eigenschaft 800

devices-Eigenschaft ................................................. 768

Devie Orientation ..................................................... 799

Dictionaries ................................................................... 225

Dictionary-Datentyp .............................................. 312

didBegin-MethodeLuftballon-Beispiel .............................................. 825

Pac-Man ................................................................. 1116

didBegin-Methode ..................................... 818, 1075didEnd-Methode ....................................................... 818

didFinishDownloadingTo-Parameter .......... 632

didFinishProcessingPhotoSampleBuffer-Parameter ............................................................. 769

didMove-Methode .................................................... 459

didReceiveMemoryWarning-Methode ....... 406

didSelectRow-Parameter ...................................... 994

didSet-Funktion ......................... 254, 288, 932, 984Beispiel .......................................................... 715, 1024

didUpdateFocus-Methode .......... 592, 595, 1151Trailer-Beispiel ....................................................... 690

discardableResult-Attribut ....................... 133, 360Disk-Image ..................................................................... 898

dismiss-Methode ............................................ 489, 523dismissController ...................................................... 525

dismissViewControllerAnimated-Methode .............................................................. 1032

Dispatch Queue .......................................................... 853

Dispatch-Framework .............................................. 849

DispatchGroup-Klasse ........................................... 855

DispatchQoS.QoSClass-Enumeration .......... 854

DispatchQueue-Klasse .................. 852, 855, 1003Code imMain-Thread ausführen ............... 635

Trailer-Beispiel ....................................................... 688

DispatchTime-Klasse ................................. 855, 1003distanceFromLocation-Methode .................... 963

distanceTo-Methode ............................................... 178

Distribution Provisioning Profile ................... 886

distribution-Eigenschaft ...................................... 429

Division durch null ..................................................... 74

DMG-Datei erstellen ................................................ 898

do-Schlüsselwort (try-catch) .............................. 334

Document-Outline-Seitenleiste ...................... 387

documentDirectory-Konstante ....................... 613

domain-Eigenschaft ................................................ 353

Doppelgänger entfernen ...................................... 224

Doppelte Optionals .................................................. 340

Double-Datentyp ....................................................... 169

Double-Init-Funktion ............................................. 201

Downcast ..................................................... 79, 295, 328Download per HTTP/HTTPS ............................... 627

fortsetzen .................................................................. 631

im Hintergrund ..................................................... 630

downloadsDirectory-Konstante ...................... 613

downloadTask-Methode ....................................... 632

Drag&Drop .................................................................. 564

Dateinamen empfangen ................... 572, 1058

Dateinamen senden ........................................ 1057

weitergeben .......................................................... 1050

Zeichenkette empfangen ................................. 572

Zeichenkette senden .......................................... 570

dragFile-Methode ................................................... 1057

draggingEntered-Methode .................... 565, 1058draggingExited-Methode .......................... 565, 576draggingPasteboard-Methode .......................... 575

draggingSession-Methode .......... 566, 571, 1057draggingUpdated-Methode ................................ 565

drand48-Funktion ....................................... 171, 1005draw-Funktion .......................................................... 1046

draw-Methode ..................................... 544, 551, 10455-Gewinnt-Beispiel ........................................... 1019

Drag&Drop-Beispiel ......................................... 569

Grafikprogrammierung ................................... 709

Hintergrundfarbe ................................................ 713

drawRect-MethodeSchatzsuche/Richtungspfeil .......................... 953

drawsBackground-Eigenschaft ......................... 679

dRnd-Funktion ............................................................ 820

Dropdown-Liste .......................................................... 990

dropFirst-Methode ................................................... 217

dropLast-Methode .................................................... 217

dynamic-Schlüsselwort ......................................... 245

1158

Page 83: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

E

EAN8/EAN13-Barcode .............................................. 774

Edges (SpriteKit) ......................................................... 829

Eigenschaften .............................................................. 251

beobachten .............................................................. 254

Computed Properties ......................................... 257

Extensions ................................................................ 322

Read-Only-Eigenschaft ..................................... 258

statische Eigenschaften ................................... 256

Zugriff mit Optional Chaining ..................... 102

Eingabefokus einstellen ........................................ 939

Einstellungsdialog (macOS) ................................ 527

element-Methode ..................................................... 637

Element-Typ ................................................................. 326

else-Schlüsselwort

guard ........................................................................... 111

if ...................................................................................... 107

Emitter (SpriteKit) ..................................................... 845

encodeXxx-Methoden ........................................... 947

endedAtPoint-Parameter ..................................... 566

endEditing-Methode .................................... 436, 988

endIndex-Eigenschaft ............................................ 195

enum-Schlüsselwort .................................................. 95

Beispiele .................................................................. 1000

Enumerationen

als Datentypen ...................................................... 247

Assiciated Values ................................................. 248

Beispiel ....................................................... 1000, 1043

indirekt/rekursiv ................................................... 250

zur Definition von Konstanten ....................... 95

Ephemeral-Konfiguration (URLSession) .... 631

equalTo-Methode ...................................................... 175

Equatable-Protokoll ................................................. 312

als Extension implementieren .................... 320

Erdbeschleunigung .................................................. 801

Error-Protokoll ............................................................ 350

escaping-Attribut ............................................ 164, 360

Eulersche Zahl ............................................................. 150

Exceptions ........................................................... 333, 345

exit-Funktion ............................................................... 589

Exit-Icon (ViewController) ................................... 450

Exponential-Operator ............................................... 88

ExpressibleByStringLiteral-Protokoll ........... 316

Extended Grapheme Cluster .............................. 185

Extensions ..................................................................... 318

Beispiele .................................................................. 1002

eigene map-Methode ........................................ 348

Protokolle ................................................................. 323

bequemer Zeichenkettenzugriff .................. 197

F

Fünf-Gewinnt-App .................................................... 997

Fade-In-Effekt ............................................................... 727

fadeAlpha-Methode ................................................. 806

fadeIn-Methode .......................................................... 806

fadeOut-Methode ...................................................... 806

Failable Init Functions ........................................... 266

fallthrough-Schlüsselwort (switch) ............... 113

false .................................................................................... 172

Farben

abdunkeln ............................................................. 1002

aufhellen ................................................................ 1002

auswählen ................................................................ 535

Literale ........................................................................ 784

Fatal Error ....................................................................... 333

fatalError-Funktion .................................................. 140

FehlerAbsicherung ............................................................ 333

auslösen (throw) ................................................... 342

do-try-catch ............................................................. 334

NSError-Klasse ....................................................... 351

Weitergabe ............................................................... 339

Fenster

ausblenden .............................................................. 564

Größe fixieren .............................................. 499, 525

in den Vordergrund bringen .......................... 562

per Code erzeugen ............................................... 526

schließen ................................................................... 525

Fernbedienung (Apple TV) ..................... 586, 1132

FileAttributeKey-Struktur .................................... 617

fileExists-Methode .................................................... 617

fileExistsAtPath-Methode ................................. 1062

FileManager-Klasse

Dateioperationen ................................................ 617

Standardverzeichnisse ermitteln ................ 613

fileprivate-Schlüsselwort ...................................... 243

fill-Methode ....................................................... 712, 953

fillColor-Eigenschaft ................................................ 788

filter-Funktion ............................................................. 188

filter-Methode ............................................................. 218

final-Schlüsselwort ........................................ 245, 291

finally-Schlüsselwort ............................................... 341

find-Funktion .............................................................. 990

Finder per Code anzeigen ................................. 1051

First Responder ................................................ 553, 939Menüs ......................................................................... 556

Tastatur (iOS) ......................................................... 438

Tastatur (macOS) ................................................. 548

first-Eigenschaft ................................... 195, 211, 217flagsChanged-Methode ......................................... 549

flashMode-Eigenschaft ......................................... 769

1159

Page 84: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

flatMap-Methode ...................................................... 220

Fließkommazahlen .................................................. 169

FloatingPoint-Protokoll ........................................ 169

Focus Engine (Apple TV) ....................................... 592

Asteroids-Beispiel .............................................. 1146

focusMode-Eigenschaft ........................................ 773

Fokus-Einstellung (Kamera) ............................... 773

follow-Methode .......................................................... 805

font-Eigenschaft ......................................................... 392

Fonts

Attribute ändern ................................................... 533

auswählen ................................................................ 535

FontManager ........................................................ 537

Font Panel ................................................................. 537

for-in-Schleife .............................................................. 118

Forced Try ....................................................................... 339

forEach-Methode ....................................................... 220

Formatieren

Datum und Uhrzeit ............................................ 203

Zahlen ......................................................................... 200

Fotos

aus der Camera-Roll auswählen ................. 761

in einer Capture-Session aufnehmen ....... 763

mit der Picker-View aufnehmen ................. 763

Foundation-Framework ........................................... 35

frame-Eigenschaft ......... 427, 516, 541, 570, 679

SKNode-Klasse ....................................................... 813

Frameworks ................................................................... 355

Xcode ........................................................................... 692

Free Provisioning ...................................................... 392

friction-Eigenschaft .............................................. 1072

front-Enumerationswert ...................................... 763

Front-Kamera ............................................................... 768

func-Schlüsselwort ................................................... 129

Funktionale Programmierung .......................... 151

Funktionen .................................................................... 129

als Parameter ......................................................... 153

als Rückgabewert ................................................. 154

Funktionstypen ..................................................... 152

globale Funktionen ............................................. 147

Gültigkeitsebenen ................................................ 137

Namen ........................................................................ 136

optionale ................................................................... 307

Parameter ................................................................. 140

Rückgabewert ........................................................ 131

Rückgabewert ignorieren ................................ 133

Standardfunktionen ........................................... 147

verschachtelte Funktionen ............................. 138

verzögert ausführen ............................. 855, 1003

Funktionsabschluss ................................................. 156

G

Game-Loop (SpriteKit) ........................................... 811

GameController-Bibliothek .................. 803, 1141

GameKit-Bibliothek .............................................. 1113

Ganze Zahlen ............................................................... 168

Garbage Collector ...................................................... 279

Gatekeeper ..................................................................... 896

GCController-Klasse ................................... 803, 1141

Generalisierung .......................................................... 295

Generated Interface ................................................. 902

Generator-Typ ............................................................. 326

Generics ........................................................................... 297

Array-Beispiel ......................................................... 216

Extensions ................................................................ 320

Protokolle ................................................................. 309

Type Constraints .................................................. 300

Gesture Recognizer

Long Press ...................................................... 932, 934

Tap ................................................................................ 988

tvOS .............................................................................. 591

get-Schlüsselwort ................................... 94, 257, 276

getifaddrs-Funktion ................................................. 361

Gimp (Parallax-Icons) ............................................. 872

Git ........................................................................................ 903

GKGridGraph-Klasse ............................................ 1113

GKInspectable-Attribut ......................................... 360

Globale Funktionen ................................................. 147

Globale Queues ........................................................... 853

Gloss-Bibliothek ......................................................... 642

Gomoku ........................................................................... 997

GPS-Funktionen ......................................................... 691

Grafikprogrammierung ........................................ 707

Drag&Drop (UIBezierPath) .......................... 569

in einer MapView (MK-Methoden) ............ 701

Hockey-Spieler zeichnen .................................. 551

Kompass-Steuerelement .................................. 714

Kreise zeichnen (UIBezierPath) .................... 542

Objekt ausschneiden ....................................... 1124

Steuerelement zur Richtungsanzeige ...... 953

Grand Central Dispatch (GCD) .......................... 849

gravity-Eigenschaft .... 801, 814, 829, 832, 1141

group-Methode (SpriteKit-Aktionen) ........... 808

groupingSeparator-Eigenschaft ....................... 985

Grundrechenarten ...................................................... 73

guard-Schlüsselwort ..................................... 111, 345

Gültigkeitsebenen

Funktionen ............................................................... 137

Klassen ....................................................................... 245

Gyroskop ......................................................................... 798

gyroUpdateInterval-Eigenschaft ..................... 800

1160

Page 85: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

H

Half-Open-Range-Operator ................................... 81

Hashable-Protokoll ........................................ 225, 312hasPrefix-Methode ................................................... 186

hasSuffix-Methode ..................................... 186, 1064Haversine-Formel ..................................................... 963

HDCP-Fehlermeldung ............................................ 752

Header-Code erzeugen .......................................... 902

height-Eigenschaft ................................................... 541

heightOfRow-Parameter ....................................... 678

Heimatverzeichnis ..................................... 613, 1125HelloWorld

Animationen ........................................................... 725

iOS-App ...................................................................... 370

iOS-Appmit Popup .............................................. 479

macOS-Programm .............................................. 493

MapView/GPS ........................................................ 691

Playground ................................................................. 23

Script .............................................................................. 39

Terminal App ............................................................. 32

Hexadezimale Zahlen ............................................. 168

Hide-Bars-On-Swipe-Option .............................. 667

HIG (Human Interface Guidelines) ..... 868, 872High-Score speichern (Asteroids-Spiel) ... 1145

higherThan-Schlüsselwort (Operatoren) ...... 88

Hintergrund-App ............................................ 696, 737horizontalAlignmentMode-Eigenschaft .... 791

HTTP(S)-Dokument laden .................................... 627

HTTPS-Probleme mit NSURL ............................. 628

Human Interface Guidelines .................. 868, 872

I

IBAction-Attribut ............................................ 360, 379IBDesignable-Attribut .................................. 360, 721IBInspectable-Attribut ................................. 360, 721IBOutlet-Attribut ............................................ 360, 379Icon .................................................................................. 1037

App ................................................................................ 868

iTunes Connect ...................................................... 892

Resizer ...................................................................... 1037

icon-Eigenschaft (NSAlert) .................................. 536

IconSize-Struktur(Icon-Resizer-Beispiel) ............................... 1043

id-Datentyp (Objective-C) .................................... 315if-available-Test ........................................................... 116

if-let-Konstruktion ................................................... 108

Kaskaden .................................................................. 109

kombiniert mit Bedingungen ....................... 110

if-Verzweigungen ....................................................... 107

let (Optionals) ................................... 101, 108, 575

image-Eigenschaft ......................................... 570, 680Image-Picker-Controller ............................. 753, 761Image-View-Steuerelement ..................... 663, 973

imageComponentsProvider-Eigenschaft 570

imageLiteral-Schlüsselwort ................................ 784

Images.xcassets-Datei ............................................ 441

UIImage-Objekt erzeugen .............................. 662

imageView-Eigenschaft ......................................... 659

Implicitly Unwrapped Optionals ....................... 99

import-Anweisung ................................................... 355

in-Schlüsselwort (Closures) ................................ 156

include-Anweisung (Bridging-Datei) ............ 362Index-Datentyp ................................................ 189, 195index-Methode ...................................... 195, 196, 218IndexPath-Klasse ....................................................... 669

indexPath-Methode ...................................... 669, 958indexPathForCell-Methode ................................ 668

indices-Eigenschaft .................................................. 222

indirect-Schlüsselwort ........................................... 250

infinity-Eigenschaft .................................................... 74

infix-Schlüsselwort ..................................................... 87

Info.plist-Datei ............................................................ 869

ändern (App Transport Security) ................ 649

Privacy-Einträge (Foto-Zugriff) .................... 761

Privacy-Einträge (Kamera-Zugriff) ............ 754

Init-Funktion ..................................................... 241, 263Designated versus Convenience ................. 265

Enumeration ........................................................... 247

Fehler auslösen (throw) .................................... 343

nil zurückgeben .................................................... 266

Overloading ............................................................ 265

Redundanz vermeiden ...................................... 294

UIViewController ................................................. 406

Vererbung ................................................................. 291

initRnd-Funktion ...................................................... 820

Inkrement-Operator .................................................. 75

inout-Schlüsselwort ................................................. 144

insert-Methode ................................................ 212, 226insertContentOf-Methode .................................. 212

insertRows-Methode ............................................... 936

insertText-Methode ................................................. 549

insertXxx-Methoden .............................................. 549

instantiateController-Methode ........................ 526

instantiateViewController-Methode ............ 485

Instanzmethoden ..................................................... 268

Int-Datentyp ................................................................. 168

Int-Init-Funktion ........................................................ 201

IntegerArithmetic-Protokoll .............................. 309

Interface .......................................................................... 301

Interface Builder ........................................................ 379

Interface Orientation .............................................. 799

internal-Schlüsselwort ........................................... 243

Internationalization (i18n) .................................. 877

Internet-Radio abspielen ...................................... 741

Interpolation (Strings) ........................................... 199

interpretKeyEvents-Methode ............................ 549

1161

Page 86: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

intersects-Methode ............................ 175, 573, 813invalidate-Methode .................................................. 856

iOSGrundlagen .............................................................. 397

HelloWorld .............................................................. 370

Simulator ....................................................... 374, 696

Versionsnummer ermitteln ........................... 583

iOS-DeviceSupport-Verzeichnis ....................... 908

IP-Adresse ermitteln ................................................ 361

iRnd-Funktion ............................................................. 820

is-Operator .................................................. 79, 297, 328isBezeled-Eigenschaft ............................................. 679

isDeletableFile-Methode ....................................... 617

isDynamic-Eigenschaft .......................................... 831

isDynamic-Eigenschaft (SpriteKit) ................. 817isEditable-Eigenschaft ............................................ 679

isEmpty-Eigenschaft .................................... 211, 226isEnabled-Eigenschaft ............................................ 934

isMultipleTouchEnabled-Eigenschaft .......... 792

isPaused-Eigenschaft .............................................. 810

isReadableFile-Methode ........................................ 617

isResting-Eigenschaft ............................................. 831

isSourceTypeAvailable-Methode .................... 753

isViewLoaded-Methode ......................................... 467

isWritableFile-Methode ......................................... 617

Iterator-Protokoll ...................................................... 326

iTunes Connect ........................................................... 886

J

Ja-Nein-Dialog .............................................................. 489

joined-Methode ............................................... 194, 223JSON-Daten verarbeiten ........................................ 640

jsonObject-Methode ................................................ 641

JSONSerialization-Klasse ...................................... 641

K

Kürzester-Pfad-Problem ..................................... 1113

Kamera wechseln ...................................................... 768

Kanonenkugel (Beispiel) ....................................... 832Key/Value-Paare ......................................................... 225

keyCode-Eigenschaft ............................................... 549

keyDown-Methode ................................................... 549

keys-Eigenschaft ........................................................ 226

keyUp-Methode .......................................................... 549

Klassen ............................................................................. 238

verschachteln ......................................................... 246

Kollisionserkennung ............................................... 813

Luftballone ............................................................... 819

Pac-Man ................................................................. 1116

Kommandoparameter .............................................. 37

Kommazahlen ............................................................ 169

Kommentare ................................................................... 44

MARK .......................................................................... 568

Playground ................................................................. 30

Kompass-Funktionen .................................. 691, 703Kalibrierung ............................................................ 705

Komplexe Zahlen (Operator-Beispiel) ............ 86

Konstanten ....................................................................... 93

Eigenschaften ......................................................... 252

Eulersche Zahl ........................................................ 150

Pi .................................................................................... 150

Kontextmenü .............................................................. 560

Koordinatensystem ................................................. 540

Kreis zeichnen ............................................... 544, 1124Kreiselkompass ........................................................... 798

Kreisteilungszahl ....................................................... 150kUTTypeMovie-Konstante .................................. 753

L

Labelbreak/continue ...................................................... 120

macOS ........................................................................ 499

SpriteKit ..................................................................... 791

Lambda-Ausdruck ..................................................... 156

Landscape-Modus ..................................................... 799

last-Eigenschaft ..................................... 195, 211, 217lastPathComponent-Eigenschaft .................... 609

Launch Image (tvOS) ............................................... 876launch-Methode ......................................................... 364

launchApplication-Methode .............................. 644

launchPath-Eigenschaft ........................................ 364

LaunchScreen.xib-Datei ........................................ 869

Lautstärke ändern ..................................................... 735

Layer ................................................................................... 750

layer-Eigenschaft .................................................... 1021

Layered Image File Format .................................. 872

Layoutregeln ................................................................. 412

View-Größe fixieren ............................................ 524

Lazy Properties ........................................................... 252

ReversedRandomAccessCollection ............ 214

LazyMapCollection-Datentyp ........................... 226

LCR-Datei ........................................................................ 872

LebenszyklusApp ................................................................................ 409

View-Controller ..................................................... 405

Left-Shift (bitweises Rechnen) ............................. 75

leftBarButtonItem-Eigenschaft ........................ 478

leftItemsSupplementBackButton-Eigenschaft .......................................................... 478

let-Schlüsselwort .......................................................... 93

in switch-Konstruktionen ............................... 115

mit if .................................................................. 108, 575

mit switch-case ..................................................... 249

mit while ................................................................... 119

1162

Page 87: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

letters-Eigenschaft .................................................... 189

line-Methode ................................................................ 712

linearDamping-Eigenschaft ................. 831, 1072lineWidth-Eigenschaft ........................................... 544

SpriteKit ..................................................................... 788

Listen-Steuerelement (iOS) ................................. 651veränderliche Listen ........................................... 669

Listenfeld ........................................................................ 990

LiteralConvertible-Protokolle ............................ 316

loadRequest-Methode ................................. 645, 923locale-Eigenschaft .......................................... 200, 203Locale-Klasse ..................................................... 200, 203

im Playground ....................................................... 200

Localization (l10n) ..................................................... 877Localization native development region ... 878

localizedCaseInsensitiveCompare ................. 187

localizedDescription-Eigenschaft ................... 353

Location Manager ..................................................... 698

Kompass .................................................................... 704

teilen ............................................................................ 948

locationInView-Methode ................................... 1024

locationInWindow-Eigenschaft ....................... 541

locationManager-Methode ...................... 700, 704locationManagerShouldDisplay-

HeadingCalibration-Methode ................. 705

lockFocus-Methode ............................................... 1045

lockForConfiguration-Methode ....................... 773

logische Operatoren ................................................... 80

Lottozahlen ................................................................... 227

Benchmarks ............................................................ 231

macOS-Beispiel ..................................................... 496

lowercased-Methode ............................................... 188

LSR-Datei ......................................................................... 872

M

Main Queue .................................................................. 853

main-Methode (Dispatch Queue) ................... 853makeImage-Funktion .......................................... 1046

makeKeyAndOrderFront-Eigenschaft ......... 562

Map Kit (MK) ................................................................ 691

map-Methode ................................................................. 81

rethrows-Beispiele ............................................... 346

mapOverlay-Methode ............................................ 701

mapView-Methode ................................................... 702

MapView-Steuerelement ...................................... 691

MARK-Kommentar ........................................... 47, 568Markdown-Kommentare ................................ 30, 45mass-Eigenschaft ...................................................... 830

Master-Ansicht zuerst anzeigen ...................... 476

Mathematische Funktionen .............................. 150

Maus .................................................................................. 539

max-Eigenschaft ........................................................ 168

max-Funktion .............................................................. 149

maximumFractionDigits-Eigenschaft ............................................... 200, 985

maxPoint-Eigenschaft ........................................... 177

maxX/maxY-Eigenschaft ..................................... 175

Maze-Klasse (Pac-Man-Spiel) .......................... 1090

MediaPlayer-Bibliothek .............................. 732, 735mediaTypes-Eigenschaft ...................................... 753

Mehrblättrige Dialoge ............................................ 527

Mehrdimensionale Arrays .................................. 215

erzeugen ................................................................. 1002

Mehrfachvererbung ................................................. 286

Menüs ............................................................................... 553

deaktivieren ............................................................. 561

Kontextmenüs ....................................................... 560

menu-EigenschaftNSApplication ........................................................ 559

NSView ........................................................................ 560

Menubar-App ............................................................... 561

Message-Box ................................................................ 535

messageText-Eigenschaft .................................... 536

Metal .................................................................................. 777Metatypen ...................................................................... 330

Methoden ....................................................................... 268

Aufruf mit Optional Chaining ...................... 102

MutatingMethods .............................................. 270

optionale ................................................................... 307

Signatur ..................................................................... 274

statische Methoden ............................................ 272

Typmethoden ......................................................... 272

middlePoint-Eigenschaft ..................................... 177

midX/midY-Eigenschaft ........................................ 175

Mikrofon (Audio-Aufnahmen) .......................... 744min-Eigenschaft ......................................................... 168

min-Funktion .............................................................. 149

minimumFractionDigits-Eigenschaft ............................................... 200, 985

minimumPressDuration-Eigenschaft ......... 932

minPoint-Eigenschaft ............................................ 177

minX/minY-Eigenschaft ....................................... 175

Mirror-Datentyp ........................................................ 329

MKMapView-Klasse ................................................. 691

MKMapViewDelegate-Protokoll ...................... 698

MKPolyline-Klasse .................................................... 701

MKPolylineRenderer ............................................... 702

MobileCoreServices-Bibliothek ....................... 753

modifierFlags-Eigenschaft ....................... 542, 549Modifizier ....................................................................... 245

Module .................................................................. 243, 355Modulo-Operator ......................................................... 73

motion-Eigenschaft ................................................. 803

mouseDown-Methode ................... 540, 546, 1057mouseDragged-Methode ............. 540, 570, 1057mouseEntered-Methode ....................................... 540

mouseExited-Methode .......................................... 540

1163

Page 88: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

mouseUp-Methode .................................................. 540

move-Methode ........................................................... 712

SpriteKit ..................................................................... 805

moveItem-Methode ................................................ 620

moveRowAt-Parameter ......................................... 938

moveXxx-Methoden ............................................... 549

Movie-Trailer-Beispiel ............................................ 682MP3/MP4-Format ..................................................... 733

MPMediaItemArtwork-Klasse ........................... 739

MPMediaItemProperty-Konstanten ............. 739

MPNowPlayingInfoCenter-Klasse .................. 739

MPVolumeView-Klasse .......................................... 735

Multi-Threading ......................................................... 849

mutating-Schlüsselwort ....................................... 270

N

Nachkommaanteil ................................................. 1085

Nachrichten anzeigen ............................................ 535

Namenlose Parameter ........................................... 142

Navigation-Controller ............................................ 456

Detailansicht einer Liste .................................. 666

mit Split-View-Controller ...................... 470, 476

mit Tab-Bar-Controller ..................................... 465

Navigation-View-Controllerweißer Streifen ....................................................... 919

navigationItem-Eigenschaft ............................... 478

Nebenläufige Programmierung ...................... 849

Nested Functions ....................................................... 138

Never-Schlüsselwort ................................................ 140

New York Times (Beispiel-App) ......................... 913next-Methode .............................................................. 326

nextFocusedItem-Eigenschaft .......................... 595

NextStep ............................................................................. 29

NIB-Datei ......................................................................... 406Nil ........................................................................................... 83Nil-Coalescing-Operator .......................................... 83

nil-Schlüsselwort .......................................................... 98

nil-Test .............................................................................. 100

noescape-Attribut ..................................................... 164

noreturn-Attribut ...................................................... 140

Notification Center .................................................. 950

AVPlayer ..................................................................... 741

NotificationCenter-Klasse ................................... 950

notify-Methode .......................................................... 855

nowPlayingInfo-Eigenschaft ............................. 739

npm-Kommando ....................................................... 898

NSAlert-Klasse ............................................................. 536

NSApplication-Klasse ................................ 505, 1051NSAppTransportSecurity-Eintrag ................... 628

NSBezierPath-Klasse ....................... 544, 569, 1124NSBitmapImageRep-Klasse ............................. 1125

NSButton-Klasse ..................................................... 1061

NSCalendar-Klasse .................................................... 204

NSCameraUsageDescription-Key ......... 756, 761NSCocoaErrorDomain ............................................ 353

NSCoder-Klasse ........................................................... 947

NSCoding-Protokoll ...................................... 406, 947NSColorPanel-Klasse ............................................... 538

NSColorWell-Steuerelement .............................. 538

NSDate-Klasse .............................................................. 203

NSDictionary-Klasse ................................................ 532

NSDraggingDestination-Protokoll ................. 564

NSDraggingImageComponent-Klasse ......... 570

NSDraggingInfo-Klasse ......................................... 575

NSDraggingItem-Klasse ............................. 565, 570NSDraggingSource-Protokoll ............... 570, 1057NSError-Klasse ............................................................. 351

NSEvent-KlasseMaus ............................................................................ 541

Tastatur ..................................................................... 549

NSEventModifierFlags-Struktur ...................... 542

NSException-Klasse ................................................. 345

NSFileManager-Klasse ......................................... 1062

NSFilenamesPboardType-Konstante . 567, 575NSFont-Klasse .............................................................. 533

NSFontManager-Klasse .............................. 533, 537NSFontPanel-Klasse ................................................. 537

NSGradient-Klasse ................................................. 1124

NSHomeDirectory-Funktion ............... 613, 1125NSImage-Klasse ............................................ 680, 1045NSImageView-Klasse ............................................... 568

NSImageView-Steuerelement ........................... 680

NSKeyedArchiver-Klasse ....................................... 947

NSLayoutConstraint-Klasse ................................ 427

NSLocale-Klasse .......................................................... 187

NSLocalizedString-Klasse ..................................... 885

NSMakeRange-Funktion ....................................... 191

NSMenu-Klasse ........................................................... 555

NSMenuItem-Klasse ................................................ 555

NSMenuValidation-Protokoll ............................ 560

NSMicrophoneUsageDescription-Key ........ 756

NSMutableDictionary-Klasse ............................ 981

NSNumber-Klasse ..................................................... 172

Beispiel Dateigröße ............................................. 617

NSNumberFormatter-Klasse ................... 678, 987NSObject-Klasse .................................... 286, 677, 946

description-Eigenschaft ................................... 311

NSObject-Protokoll .................................................. 949

NSObjectProtocol-Protokoll .................... 286, 949NSOpenPanel-Klasse ............................................... 536

Datei auswählen ............................................... 1060

Verzeichnisauswahl ......................................... 1051

NSPasteBoard-Klasse .............................................. 575

NSPhotoLibraryUsageDescription-Key .................................................................. 754, 761

NSPoint-Klasse ............................................................ 570

1164

Page 89: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

NSPoint-Struktur ....................................................... 541

NSProgressIndicator-Steuerelement ............ 859

NSRect-Klasse .............................................................. 570

NSRect-Struktur ......................................................... 541

NSRectFill-Methode ................................................. 544

NSRegularExpression-Klasse ............................. 191

NSResponder-Klasse ..................................... 548, 556NSSavePanel-Klasse ................................................. 536

NSSize-Klasse ............................................................... 570

NSSize-Struktur .......................................................... 541

NSSortDescriptor-Klasse ...................................... 681

NSSplitter-Klasse ....................................................... 530

NSSplitView-Steuerelement ............................ 1039

Delegation ............................................................. 1053

NSSplitViewController-Klasse ........................ 1040

NSSplitViewDelegate-Protokoll ..................... 1053NSStatusBar-Klasse .................................................. 562

NSString-Datentyp ................................................... 181

NSStringPboardType-Konstante ..................... 567

NSTableView-Steuerelement .............................. 671

NSTableViewDataSource-Protokoll ............... 673

Icon-Resizer-Beispiel ....................................... 1054

NSTableViewDelegate-Protokoll ........ 673, 1056NSTabViewController-Steuerelement .......... 527

NSTemporaryDirectory-Funktion .... 614, 1062NSTextField-Steuerelement ..................... 499, 679NSURL-Klasse ............................................................... 628

NSURLConnection-Klasse .................................... 631

NSUUID-Klasse ........................................................... 614

NSView-Klasse .................................................. 495, 678NSViewController-Klasse ........................... 495, 515NSWindow-Klasse .......................................... 495, 500NSWindowController-Klasse ................... 495, 511NSWindowDelegate-Protokoll ............... 510, 514NSWorkspace-Klasse .................................. 644, 1051NSxxx-Klassennamen ............................................... 29

null-Schlüsselwort ....................................................... 98

NumberFormatter-Klasse .............. 200, 202, 985numberFromString-Methode ........................... 202

numberOfComponents-Methode .................. 991

numberOfLoops-Eigenschaft ............................ 734

numberOfMatches-Methode ............................. 191

numberOfRowsInComponent-Parameter 991

numberOfRowsInSection-Parameter .......... 654

numberOfRowsInTableView-Methode ....... 673

numberOfSectionsInTableView-Methode 654

O

objc-Attribut ...................................................... 307, 360ObjCBool-Typ ............................................................... 618

objectForKey-Methode .......................................... 981

objectValueForTableColumn-Methode ....... 673

Objektorientierte Programmierung ............. 237

Observer (Eigenschaften) ..................................... 254

Observer (Notification Manager) .................... 951Oktale Zahlen ............................................................... 168

on-Eigenschaft ............................................................ 728

open-Methode (Webseite öffnen) ........ 644, 645open-Schlüsselwort ................................................. 243

Operatoren ....................................................................... 71

Assoziativität ............................................................ 84

eigene Operatoren für CGPoint undCGVector ................................................................ 175

eigener Exponential-Operator ........................ 88

eigener Operatoren für komplexe Zahlen 86

eigener Vergleichsoperator ............................... 87

eigener Vergleichsoperator fürVektoren ................................................................. 273

Priorität ........................................................................ 84

selbst definieren ....................................................... 86

selbst definieren, Beispiel ................................ 200

Optional Chaining ............................................ 84, 101Optional Try .................................................................. 339

optional-Schlüsselwort .......................................... 307

Optionale Funktionen/Methoden ................. 307

Optionale Parameter ............................................... 145

Optionale Protokollregeln ................................... 307

Optionals ................................................................... 83, 98als Rückgabewert von Funktionen ............ 132

doppelte Optionals ............................................. 340

if-let-Kombination .................................... 108, 575

in Kombinationmit try .................................... 340

Init-Funktion ........................................................... 266

OptionSet-Protokoll ................................................ 227

orderFrontFontPanel-Methode ........................ 537

orderOut-Methode ................................................... 564

origin-Eigenschaft .................................................... 541

os-Test ............................................................................... 117

Outlets ................................................................... 378, 399Collections ................................................................ 382

macOS ........................................................................ 502

umbenennen .......................................................... 382

OverloadingFunktionen ............................................................... 136

Init-Funktion ........................................................... 265

override-Schlüsselwort .......................................... 287

Computed Properties ......................................... 289

Property Observers ............................................. 288

View-Controller ..................................................... 408

P

Package Manager ....................................................... 359

Palindromtest .............................................................. 189

Parallax-Effekt ............................................................ 871

1165

Page 90: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

Parameter ....................................................................... 140

autoclosures ........................................................... 159

benannte Parameter .......................................... 130

benannte, in Init-Funktionen ........................ 264

benannte, in Protokollen ................................. 303

Inout-Parameter ................................................... 144

noescape ................................................................... 164

optionale Parameter ......................................... 145

unbenannte Parameter .................................... 142

variable Anzahl ..................................................... 146

von Terminal-Apps ................................................. 37

zweinamige Parameter .................................... 142

ParsenDatum und Uhrzeit ............................................ 204

Zahlen ......................................................................... 202

Partikel-Emitter .......................................................... 845

path-Eigenschaft ........................................................ 609

path-Methode (Bundle-Dateien) ..................... 610

pathFinder-Methode ............................................ 1114

Pattern-Zeichen ............................................................. 72

pause-Methode ........................................................... 741

PDF417-Barcode ........................................................... 774

perform-Funktion ..................................................... 855

performDragOperation-Methode ........................................ 565, 576, 1059

performSegue-Methode ............................ 454, 526Navigation-Controller ...................................... 459

permittedArrowDirections-Eigenschaft .... 484

Photo Library ............................................................... 761

physicalMemory-Eigenschaft ........................... 584

physicsBody-Eigenschaft ..................................... 815

physicsWorld-Eigenschaft ................................... 814

Physik (SpriteKit) ....................................................... 826Pi-Konstante ................................................................. 150

Picker-View-Steuerelement ...................... 973, 990Rollover ...................................................................... 991

pickerView-Methode ............................................... 991

picturesDirectory-Konstante ............................. 613

Pin-Button ..................................................................... 413

Pipe-Klasse ..................................................................... 364

Pixel versus Punkt .................................................... 412

Platformspezifischer Code .................................. 117

play-Methode ............................................................... 733

playerViewDidBecomeReady-Methode ...... 759

Playground ....................................................................... 24

auf dem iPad ............................................................. 40

Locale-Einstellunge ............................................. 200

playSoundFileNamed-Methode ....................... 808

PLIST-Format ................................................................ 603

PNG-Datei speichernNSBitmapImageRep ........................................ 1124

CGImage ................................................................ 1047

PolygoneSpriteKit ..................................................................... 834

zeichnen .................................................................. 1124

Polymorphie ................................................................. 295

Popover-Segue ............................................................ 478

popToRootViewController-Methode ............ 460

popToViewController-Methode ....................... 460

Popups .............................................................................. 478

5-Gewinnt-App .................................................... 1031

Größe einstellen .................................................... 481

per Code anzeigen ............................................... 485

Richtung festlegen .............................................. 483

popViewController-Methode .................. 460, 966position-Eigenschaft ............................................... 783

post-Methode (Notification Manager) ........ 951

postfix-Schlüsselwort ................................................ 87

Potenzieren ...................................................................... 74

pow-Funktion ................................................................. 74

Precedence-Gruppen ......................................... 84, 87precedencegroup-Schlüsselwort ........................ 88

preferredBarTintColor-Eigenschaft ............... 649

preferredContentSize-Eigenschaft ................. 482

preferredControlTintColor-Eigenschaft ..... 649

preferredFocusEnvironments-Eigen-schaft ............................................ 596, 1133, 1150

prefersStatusBarHidden-Eigenschaft .......................................................... 785, 1067

prefix .................................................................................... 87

prefix-Methode ........................................................... 217

prefix-Schlüsselwort .................................................. 87

prepare-Methode ............................................ 452, 522Detailansicht bei Table-View ........................ 668

Popups auf dem iPhone ................................... 480

prepareToPlay-Methode ....................................... 733

preprareForDragOperation-Methode .......... 565

present-Methode ................................. 485, 490, 649für Alert-Dialoge .................................................. 490

Presentation-Controller ........................................ 447

presentedViewController-Eigenschaft ........ 411

Presenting Segues ..................................................... 521

presentingViewController-Eigenschaft ...... 483

presentScene-Klasse ................................................ 842

presses-Methoden .................................................... 590

pressesBegan-Methode ...................................... 1132

previousLocation-Methode ................................ 793

previouslyFocusedItem-Eigenschaft ............ 595

print-Funktion ............................................................ 149

CustomStringConvertible-Protokoll ......... 311

Printable-Protokoll ................................................... 311

printf-Syntax ................................................................ 199

Priorität von Operatoren ........................................ 84

Privacy-Einträge in Info.plist ............................. 754

Kamera verwenden ............................................ 756

private(set) für Read-only-Eigenschaften 258

1166

Page 91: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

private-Schlüsselwort ............................................. 243

Process-Klasse ............................................................. 364

ProcessInfo-Klasse .................................................... 584

Programmsignieren .................................................................... 895

weitergeben ............................................................. 895

ProgrammendeiOS ................................................................................. 409

macOS ................................................... 505, 510, 514

Projekte umbenennen ........................................... 906

prompt-Eigenschaft ................................................. 457

Properties ....................................................................... 251

Computed Properties .............................. 257, 289

Extensions ................................................................ 322

Lazy Properties ...................................................... 252

Property Observers............................. 254, 288, 715, 932, 984, 1024

Read-Only Computed Property ................... 258

Static Properties ................................................... 256

Type Properties ..................................................... 256

Property Lists (User-Defaults) ................ 603, 931propertyList-Methode ............................................ 575

protocol-Schlüsselwort ............................... 303, 330Protokolle ....................................................................... 301

erweitern ................................................................... 323

Extensions ................................................................ 319

für generische Typen .......................................... 309

nur für Klassen ...................................................... 304

optionale Regeln .................................................. 307

Protocol Composition ....................................... 305

Standardprotokolle ............................................ 310

Vererbung ................................................................. 304

PrototypzellenCollection-View ..................................................... 686

Table-View ................................................................ 657

Provisioning Profile ...................................... 393, 886Pseudo-3D ...................................................................... 778

public-Schlüsselwort ............................................... 243

Punkt versus Pixel .................................................... 412Pyramide (Beispiel) .................................................. 832

Q

qos-Parameter ............................................................. 852

QR-Codes erkennen ................................................. 772

Quality of Service (async-Methode) 852, 854Queues (asynchrone Programmierung) .... 853

R

Rückgabewerte (Funktionen) ............................ 131

Radio-Stream abspielen ........................................ 741

radix-Parameter ......................................................... 168

raise-Methode ............................................................. 345

RAM-Größe ermitteln ............................................ 584

Rand eines Steuerelements ................................ 407

RandomNumbers .................................................... 171

Range-Datentypen ...................................................... 81

range-Methode (Zeichenketten) ...................... 189

Range-Operatoren ....................................................... 81

rangeOfCharacter-Methode ............................... 189

rate-Eigenschaft .......................................................... 742

RawOptionSetType-Protokoll ........................... 542

rawValue-Eigenschaft ..................................... 96, 248Read-Only-Eigenschaft .......................................... 258

readDataToEndOfFile-Methode ....................... 364

readLine-Funktion .................................................... 149

readObjects-Methode ............................................. 575

rear-Enumerationswert ........................................ 763

Rear-Kamera ................................................................. 768

Rechenoperatoren ....................................................... 73

record-Methode .......................................................... 746

Redraw-Einstellung (contentMode) .............. 718

reduce-Methode ......................................................... 222

Reference Counting ................................................. 279

Referenztypen ..................................................... 72, 103Reflection ....................................................................... 329

Regeln (Auto Layout) ............................................... 412register-Methode ................................. 531, 532, 567registerForDraggedTypes-Methode 564, 1050Reguläre Ausdrücke ................................................. 191

Rekursion ....................................................................... 138

Enumerationen ..................................................... 250

indirekte Enumeration ..................................... 250

Verzeichnisbaum durchlaufen ..................... 618

reloadData-Methode .................................... 669, 681reloadRows-Methode .............................................. 669

reloadRowsAtIndexPaths-Methode .............. 937

remoteControl-Enumeration ............................ 738

remoteControlReceived-Methode ................. 738

remove-Methode ............................................ 213, 226removeAllActions-Methode ............................... 810

removeFirst-Methode ............................................ 213

removeFromParent ................................................. 809

removeFromSubview-Methode .................... 1023

removeItem-Methode ............................................ 620

removeItemAtPath-Methode ......................... 1062

removeLast-Methode ............................................. 213

removeObserver-Methode .................................. 952

removeSubrange-Methode ................................. 213

Renju ................................................................................. 999

repeat-Methode (SpriteKit-Aktionen) .......... 809

repeat-while-Schleife .............................................. 120

repeatForever-Methode(SpriteKit-Aktionen) ............................ 807, 809

REPL-Modus ..................................................................... 38

replaceCurrentItem-Methode ........................... 740

replaceSubrange-Methode ....................... 190, 213

1167

Page 92: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

replacingOccurrences-Methode ........... 190, 680representedObject-Eigenschaft ........................ 501

requestAlwaysAuthorization-Methode ..................................................... 693, 698

requestRecordPermission-Methode ............. 745

requestWhenInUseAuthorization-Methode ................................................................ 693

required-Schlüsselwort ......................................... 293

reserveCapacity-Methode .................................... 214

resignFirstResponder-Methode ....................... 548

Resistance Priority ................................................... 432

Resolve-Layout-Issues-Button .......................... 413

ResponderMenüauswahl ........................................................ 556

Responderkette ..................................................... 553

Tastaturereignisse ............................................... 548

Ressourcen .................................................................... 610

restitution-Eigenschaft ............................ 831, 1072reStructuredText-Kommentare .......................... 30

Restwert-Operator ....................................................... 73

resume-Methode ....................................................... 630

rethrows-Schlüsselwort ........................................ 346

Retroactive Modeling ............................................. 318

return-Schlüsselwort .............................................. 129

Reverse Polish Notation ........................................ 160

reverse-Methode ........................................................ 214

reversed-Methode ..................................................... 188

SpriteKit-Aktionen ............................................... 809

Richtung zwischen zweiKoordinatenpunkten .................................... 963

Right-Shift (bitweises Rechnen) ......................... 75

rightMouseDown-Methode ............................... 540

rightMouseDragged-Methode .......................... 540

rightMouseUp-Methode ....................................... 540

Rollover (Picker-View) ............................................ 992

Root-View-Controller ................................... 405, 411rootViewController-Eigenschaft 405, 411, 473rotate-Methoden (SpriteKit-Aktionen) ....... 806

rotationRate-Eigenschaft ..................................... 801

round-Funktion .......................................................... 170

rowHeightForComponent-Parameter ......... 994

RPN-Rechner ................................................................ 160

RSS-Datei auswerten ............................................... 684

run-Methode (SpriteKit) ....................................... 805,myhyperpage810

runModal-Methode ................................................. 536

S

SafariServices-Bibliothek ..................................... 645

SandboxiOS ................................................................................. 613

macOS ......................................................................... 614

macOS, Icon-Resizer ........................................ 1042

scale-Methoden (SpriteKit-Aktionen) .......... 806

Scene-Editor .................................................................. 838

SceneKit ........................................................................... 777

Schalter (UISwitch-Steuerelement) ............... 728

Schatzsuche ................................................................... 941

scheduledTimer-Methode ................................... 856

Schlüssel-Wert-Paare ............................................... 225

Schlüsselwörter als Variablennamen .............. 92

Schleifen .......................................................................... 117

abbrechen (break) ............................................... 120

nicht-triviale Schleifen ...................................... 122

Schnittstelle .................................................................. 301

Schrift auswählen ...................................................... 535

Schriftattribute ändern ......................................... 533

Schwerkraft (SpriteKit) ........................................... 814Screenshots (Apple TV) .......................................... 581scrollPosition-Parameter (Table-View) ........ 657scrollToRow-Methode ................................. 669, 936scrollXxx-Methoden ............................................... 549

SearchPathDirectory-Enumeration .............. 613

SearchPathDomainMask-Struktur ................ 613

Segues ............................................................................... 446

Datenübergabe ..................................................... 522

Datenübertragung .............................................. 451

macOS ......................................................................... 521

per Code initiieren ............................................... 454

Popover ...................................................................... 478

Unwind ............................................................ 448, 453

vonMenüeinträgen ............................................ 557

SelectedImage-Eigenschaft ................................. 464

selectedIndex-Eigenschaft ................................... 467

selectedRow-Eigenschaft ...................................... 682

selectedViewController-Eigenschaft ............. 467

selectRow-Eigenschaft ........................................... 990

selectRow-Methode ................................................. 657

selectXxx-Methoden ............................................... 549

Selektor ...................................................... 426, 562, 933Syntax .............................................................. 275, 426

self-Schlüsselwort ..................................................... 242

bei Enumerationen .......................................... 1000

in Closures ................................................................ 159

in MutatingMethods ........................................ 271

Klassentyp ................................................................ 316

Self-Schlüsselwort ..................................................... 242

Protokolle ...................................................... 304, 312

Selfie-Kamera ............................................................... 768

sequence-Methode (SpriteKit-Aktionen) ... 809

Sequence-Protokoll ....................................... 118, 326Serielle Queues ........................................................... 853

Set-Datentyp ................................................................ 226

Option-Sets .............................................................. 227

uniqueSet-Methode ............................................ 327

set-Schlüsselwort .................................... 94, 257, 276setAction-Methode (NSColorPanel) .............. 538

1168

Page 93: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

setActive-Methode (AVAudioSession) .......... 745setCategory-Methode ............................................. 745

setDataSouce-Methode ......................................... 677

setDelegate-Methode .............................................. 677

setEditing-Methode ...................................... 670, 934setFill-Methode ................................................ 712, 953setLineDash-Methode ............................................ 712

setNeedsDisplay-Methode 546, 569, 715, 1019setNeedsFocusUpdate-Methode ........ 596, 1150setObject-Methode ................................................... 981

setRegion-Methode .................................................. 700

setSelectedFont-Methode .................................... 537

setStroke-Methode ........................................ 712, 953setTarget-Methode (NSColorPanel) ............... 538

setTitle-Methode ........................................................ 934

setVolume-Methode ................................................ 735

SFSafariViewController-Klasse ......................... 645

Shapes (SpriteKit) ...................................................... 788shared-Methode ................................... 411, 537, 538sharedApplication-Methode ................ 505, 1051sharedWorkspace-Methode ............................. 1051

shift-Eigenschaft ........................................................ 542

Short-Circuit Evaluation .......................................... 80

Shortest Path Algorithm .................................... 1113

shouldAutorotate-Eigenschaft ......................... 785

shouldChangeCharactersInRange-Parameter ............................................................. 987

shouldUseExtendedBackgroundIdle-Mode-Eigenschaft ........................................... 631

showDetailViewController-Methode ........... 475

showPhysics-Eigenschaft ..................................... 816

showWindow-Methode .............................. 512, 526Shuffle-Algorithms ................................................... 224

Signatur ........................................................................... 426

Signatur vonMethoden ........................................ 274

Simulator (iOS) ............................................................ 374GPS-Funktionen .................................................... 696

Singleton-Muster ....................................................... 256

size-Eigenschaft .......................................................... 541

SpriteKit ..................................................................... 787

sizeThatFits-Methode ............................................. 483

sizeToFit-Methode .................................................... 439

SKAction-Klasse ......................................................... 804

SKEmitterNode-Klasse ........................................... 845

SKLabelNode-Eigenschaft .................................... 791

SKPhysicsBody-Klasse ............................................ 815

SKPhysicsContact-Klasse ...................................... 818

SKPhysicsContactDelegate-Protokoll .................................................. 814, 1075

SKPhysicsWorld-Klasse .......................................... 814

visualisieren ............................................................ 816

SKScene-Klasse ............................................................ 781

in eine andere Szene wechseln ..................... 842

Scene-Editor ............................................................ 838

SKShapeNode-Klasse .............................................. 788

SKSpriteNode-Klasse ............................................... 783

SKTransition-Klasse ................................................. 842

SKU (Stock Keeping Unit) ..................................... 891

SKView-Klasse .............................................................. 821

sleep-Funktion ............................................................ 856

Slices (Arrays) ............................................................... 211

sort-Methode .................................................... 187, 213für NSTableView .................................................... 681

sortDescriptors-Eigenschaft .............................. 681

sortDescriptorsDidChange-Parameter ....... 681

sorted-Methode .......................................................... 214

sortedArray-Methode ............................................. 681

Sortierordnung für Zeichenketten ................. 187

Source Control ............................................................ 903

sourceOperationMaskFor-Parameter .......... 566

sourceOperationMaskForDragging-Context-Parameter ........................... 571, 1057

sourceRect-Eigenschaft ......................................... 485

sourceType-Eigenschaft ....... 753, 756, 761, 763sourceView-Eigenschaft ........................................ 485

spacing-Eigenschaft ................................................. 429

spctl-Kommando ....................................................... 897

speed-Eigenschaft ..................................................... 832

Speicherplatz ermitteln ........................................ 584

Speicherverwaltung ................................................. 279

Spinner-Steuerelement ......................................... 851

split-Methode .................................................... 194, 223Split-View ..................................................................... 1039

Delegation ............................................................. 1053

Split-View-Controller ................................. 468, 1040NYT-Beispiel ............................................................. 924

Splitter-Steuerelement .......................................... 530

splitView-Methode ................................................ 1053

splitViewController-Methode ........................... 476

SpriteKit ........................................................................... 777

srand48-Funktion ........................................ 171, 1005SSLHandshake failed (NSURL-Klasse) .......... 628

Stack-Button ................................................................. 413

Stack-Speicher ............................................................. 139

Stack-View ...................................................................... 429

Animationen ........................................................... 728

rückgängig machen ........................................... 386

Standarddialoge ......................................................... 535

iOS ................................................................................. 489

Standardfunktionen ................................................ 147

standardOutput-Eigenschaft ............................. 364

Standardprotokolle .................................................. 310

standardUserDefaults-Methode ...................... 532

startAccelerometerUpdates-Methode ......... 800

Startansicht ................................................................... 869

startDeviceMotionUpdates-Methode .......... 800

startGyroUpdates-Methode ............................... 800

1169

Page 94: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

startIndex-Eigenschaft .......................................... 195

startRunning-Methode .......................................... 767

starts-Methode ............................................................ 217

startUpdatingHeading-Methode .................... 704

startUpdatingLocation-Methode .................... 698

state-Eigenschaft ............................... 559, 934, 1061Static Properties ......................................................... 256

static-Schlüsselwort ................................................. 272

Statische Methoden ................................................. 272

Statusbar .............................................................. 562, 785anzeigen .................................................................... 432

statusItem-Methode ................................................ 562

Steuerelementeein- und ausblenden .......................................... 728

selbst programmieren ...................................... 708

stop-Methode .............................................................. 733

Stored Properties ....................................................... 251

StoryboardFenster per Code erzeugen ............................. 526

iOS ...................................................................... 371, 372

macOS .............................................................. 495, 519

storyboard-Eigenschaft ......................................... 526

stride-Funktion ........................................................... 126

String-Datentyp .......................................................... 181

als Datei lesen/schreiben ................................. 621

String-Interpolation ..................................... 183, 199String-Konstruktor ................................................... 168

string-MethodeDateFormatter ...................................................... 203

NumberFormatter ............................................... 200

String.Index-Datentyp ........................................... 195

stringByAppendingPathComponent-Methode .............................................................. 1062

stringValue-Eigenschaft ............................. 503, 679stroke-Methode .......................... 544, 569, 712, 953strokeColor-Eigenschaft ........................................ 788

strong-Schlüsselwort .............................................. 281

struct-Schlüsselwort ................................................ 240

Strukturen ...................................................................... 238

verschachteln ......................................................... 246

styleMask-Eigenschaft ........................................... 525

Subclassing .................................................................... 285

Subscripts ....................................................................... 276

bequemer Zeichenkettenzugriff .................. 197

Substrings lesen ......................................................... 195

subtract-Methode ..................................................... 169

subtracting-Methode .............................................. 169

subtype-Eigenschaft ................................................ 738

subviews-Eigenschaft .......................................... 1016

Suchen und Ersetzen in Zeichenketten ...... 189

suffix-Methode ........................................................... 217

super-Schlüsselwort ................................................ 289

supportedFlashModes-Eigenschaft ............... 769

supportedInterfaceOrientation-Eigenschaft .......................................................... 785

swap-Funktion ............................................................ 149

SwiftCompiler ....................................................................... 40

Interpreter ................................................................... 38

Playgrounds für das iPad ................................... 40

Swift-Schlüsselwort ....................................... 148, 178swift-Versionstest ...................................................... 117

swiftdoc-Dateien ........................................................ 356

swiftmodule-Dateien .............................................. 355

switch-Verzweigungen ........................................... 112

Enumeration ........................................................... 249

Tupel ............................................................................ 230

sync-Methode .............................................................. 857

Syntaktischer ZuckerGenerics ..................................................................... 299

Optionals .................................................................. 103

Synthesized Headers ............................................... 902

systemFreeSize-Konstante .................................. 585

Systemfunktionen aufrufen ............................... 364

Systemklänge abspielen ........................................ 740

systemSize-Konstante ............................................ 585

systemStatusBar-Methode .................................. 562

systemVersion-Eigenschaft ................................ 583

Szene (iOS) ..................................................................... 372

T

Tab-Bar-Controller .................................................... 461

Tab-Bar-Items ............................................................... 462

Tab-View-Controller ................................................. 527

tabBarController-Eigenschaft ............................ 467

tabBarController-Methode .................................. 465

Table-View-SteuerelementiOS ................................................................................. 651

Listeneintrag per Code auswählen ............ 657

macOS ......................................................................... 671

Prototypzellen ........................................................ 657

Reaktion auf Elementauswahl ..................... 656

veränderliche Listen ........................................... 669

tableFooterView-Eigenschaft ............................. 657

tableView-Methoden ......................... 654, 673, 678Icon-Resizer-Beispiel ....................................... 1054

tableViewSelectionDidChange-Methode .. 682

Tag-Eigenschaft (Tab-Bar-Item) ........................ 464

Tap Gesture Recognizer ......................................... 988

Targets (Xcode) ......................................................... 1121Tastatur (iOS) ..................................................... 375, 433

ausblenden .................................................... 438, 988

einblenden ............................................................... 939

Tastaturfokus setzen ............................... 438, 959

Tastatur (macOS) ........................................................ 547Teilzeichenketten extrahieren .......................... 195

1170

Page 95: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

TelevisionMarkup Language ............................. 579

Temporäre Datei ........................................................ 614

Temporäres Verzeichnis .......................... 614, 1062Inhalt löschen ......................................................... 757

terminate-Methode .................................... 505, 1051terminator-Parameter ............................................ 149

Ternärer Operator ........................................................ 82

Beispiel ............................................ 728, 1019, 1029

Terrains (in Tiled) .................................................... 1083testable-Attribut .............................................. 245, 360Textdateien .................................................................... 621

Texteingaben (iOS) ................................................... 433

textField-Methode ......................................... 437, 987textFieldShouldReturn-Methode ................... 436

textLabel-Eigenschaft ............................................. 659

Textur (SpriteKit) ....................................................... 784

Atlas ............................................................... 806, 1079

Textured Button ...................................................... 1040

throw- und throws-Schlüsselwort .................. 342

bei Funktionsparametern ............................... 346

in Init-Funktionen ............................................... 343

Tilde-Operator (binäre Inversion) ..................... 75

Tile Maps ...................................................................... 1080

Tiled Textures ................................................. 788, 1080Tiled-Programm ...................................................... 1080

Tileset ............................................................................. 1081

timeIntervalSince-Methode ............................... 206

Timer-Klasse ................................................................. 856

AVAudioRecorder-Beispiel ............................... 748

Tint-Color (SFSafariViewController) ............. 649

titleForRow-Parameter .......................................... 992

TLSv1.2-SSL-Verschlüsselung für NSURL ..... 628

Todo-Liste ....................................................................... 930

Tool Tips ........................................................................ 1041

Top Shelf Image (tvOS) ........................................... 876topViewController-Eigenschaft ........................ 473

touches-Methoden ..................................... 792, 1024Asteroids-Beispiel .............................................. 1140

Breakout-Spiel ..................................................... 1073

Kanonenkugel-Beispiel ..................................... 836

Pac-Man-Beispiel ............................................... 1101

tvOS .............................................................................. 586

Trackpad .......................................................................... 539

Trailer-Beispiel ............................................................ 682Trailing Closure ........................................................... 157

Trailing Closures ........................................................ 157

traits-Methode ............................................................ 537

translatesAutoresizingMaskInto-Constraints-Eigenschaft .............................. 427

Transparenz .................................................................. 728

trashDirectory-Konstante .................................... 613

trashItem-Methode .................................................. 620

trimmingCharacters-Methode ......................... 188

true ..................................................................................... 172

truncatingRemainder-Methode ................... 1085

try-catch-Konstruktion ......................................... 333

Forced Try ................................................................. 339

mit do-catch ............................................................ 334

ohne do-catch ........................................................ 339

Optional Try ............................................................ 339

Tupel .................................................................................. 229als Rückgabewert von Funktionen ............ 132

in switch-Konstruktionen ............................... 114

switch-Auswertung ............................................. 230

TVML-Apps ..................................................................... 579

tvOS .................................................................................... 579

Asteroids-Spiel .................................................... 1127

Bewegungssteuerung .......................... 803, 1141

Pac-Man ................................................................. 1120

touch-Ereignisse ................................................... 796

Versionsnummer ermitteln ........................... 583

Videos abspielen ................................................... 752

Type Annotation .......................................................... 92

Type Constraints ........................................................ 300

Type Properties ........................................................... 256

type-Funktion ................................................... 329, 330

Type-Schlüsselwort .................................................. 330

typealias-Schlüsselwort ........................................ 278

AnyClass-Datentyp ............................................. 316

Generics ..................................................................... 301

TypenAliasse ......................................................................... 278

Metatypen ................................................................ 330

Typmethoden .............................................................. 272

U

Uhrzeit .............................................................................. 203

UIActionController-Klasse (Beispiel) ............ 966UIActivityIndicatorView-Steuerelement ... 851

UIAlertAction-Klasse .............................................. 490

UIAlertController-Klasse ...................................... 489

UIApplication-Eigenschaft .................................. 411

UIApplication-Klasse ................................... 410, 645UIApplicationDelegate-Protokoll ................... 410

UIApplicationMain-Attribut ................... 360, 409UIBarButtonItem-Steuerelement ................... 458

UIBezierPath-Klasse ................................................ 834

Beispiel Kompass ................................................. 714

Beispiel Richtungsanzeige .............................. 953

Grundlagen .............................................................. 711

UIButton-Steuerelement ...................................... 426

UIColor-Klasse erweitern .................................. 1002

UIColor-Struktur ........................................................ 407

UIDevice-Klasse .......................................................... 583

UIDeviceOrientationDidChange-Nachricht .............................................................. 720

1171

Page 96: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

UIFocusUpdateContext-Klasse ......................... 595

UIFont-Klasse ............................................................... 392

UIGestureRecognizerDelegate-Protokoll ..................................................... 932, 988

UIGraphicsGetCurrentContext-Methode ................................................................ 723

UIImage-Klasse ........................................................... 662

Bild herunterladen .............................................. 628

UIImagePickerController-Klasse .......... 753, 761UIImageView-Klasse

Instanz per Code erzeugen ............................. 993

UIImageView-Steuerelement ...... 442, 663, 973UIKit-Framework ....................................................... 403

UILabel-Steuerelement ......................................... 993

mehrzeiliger Text ................................................. 439

UILongPressGestureRecognizer-Klasse ............................................................ 932, 934

UINavigationController-Klasse ........................ 456

UInt-Datentyp ............................................................. 168

UIPickerView-Steuerelement ................. 973, 990Rollover ...................................................................... 991

UIPickerViewDataSource-Protokoll .............. 991

UIPickerViewDelegate-Protokoll ..................... 991

UIPopoverPresentationController-Delegate-Protokoll .......................................... 480

UIScreen-Klasse .......................................................... 403

UISplitViewController-Klasse ............................ 468

NYT-Beispiel ............................................................. 924

UISplitViewControllerDelegate-Protokoll 476

UIStackView-Steuerelement ................... 413, 429UIStoryboardSegue-Klasse .................................. 453

UISwitch-Steuerelement ...................................... 728

UITabBarController-Klasse .................................. 461

UITabBarControllerDelegate-Protokoll ....... 465

UITabBarItem-Klasse ............................................... 462

UITableView-Steuerelement .............................. 651

Delete on Swipe ..................................................... 938

Prototypzellen ........................................................ 657

veränderliche Listen ........................................... 669

UITableViewCell-Klasse .............................. 654, 665UITableViewCellStyle-Enumeration ............. 658

UITableViewController-Klasse .......................... 652

UITableViewDataSource-Protokoll ................ 654

UITableViewDelegate-Protokoll ....................... 656UITapGestureRecognizer-Klasse ..................... 988

UITextField-Steuerelement ................................ 433

EditingChanged-Ereignis ................................ 989

ValueChanged-Ereignis .................................... 989

UITextFieldDelegate-Protokoll ......................... 436

UITextView-Steuerelement ................................. 407

UITouch-Klasse .............................................. 792, 1024UIView-Klasse ........................................ 403, 708, 953

Größenänderung feststellen ....................... 1024

Instanz per Code erzeugen ............................. 993

UIViewController-Klasse ........................... 403, 405Lebenszyklus ........................................................... 405

UIWebView-Steuerelement ................................ 645

NYT-Bestseller-App .............................................. 923

UIWindow-Klasse ........................................... 402, 411Umrandung eines Steuerelements ................ 407

Unärer Operator ........................................................... 82

unable to simultaneously satisfyconstraints (Fehlermeldung) ................... 427

unarchiveObjectWithFile-Methoden ............ 947

Unbenannte Parameter ........................................ 142

UnicodeSkalar .......................................................................... 185

Textdateien .............................................................. 621

unicodeScalars-Eigenschaft ............................... 193

Beispiel ....................................................................... 261

Uniform Resource Locator .................................. 608

uniqueSet-Methode ................................................. 327

unlockFocus-Methode ........................................ 1045

unlockForConfiguration-Methode ................ 773

unowned-Schlüsselwort ....................................... 280

unowned self in Closures ...................... 164, 726

unrecognized-selector-Fehler ........................... 382

unregisterDraggedTypes-Methode ............ 1050

UnsafeMutablePointer-Struktur ..................... 362

Unwind Segues ................................................ 448, 453Popups ........................................................................ 487

Unwrapping-Operator ...................................... 83, 99Upcast ............................................................................... 295

updateFocusIfNeeded-Methode ........ 596, 1150uppercased-Methode .............................................. 188

url-MethodeBundle-Datei ........................................................... 611

URL-Struktur ........................................... 608, 627, 978URLForRessource-Methode ................................ 532

URLRequest-Klasse ........................................ 645, 923URLs-Eigenschaft ....................................................... 536

urls-Methode ................................................................ 613

urlSession-Delegate-Methoden ....................... 632

URLSession-Klasse .................................................... 630

URLSessionDownloadDelegate-Protokoll . 630

URLSessionDownloadTask-Klasse ................. 630

useGroupingSeparator-Eigenschaft .............. 200

UserDefaults-Klasse ........................... 531, 603, 981Asteroids-Spiel .................................................... 1147

Beispiel ....................................................................... 931

Defaultwerte ........................................................... 531

iOS ................................................................................. 603

macOS ......................................................................... 531

Währungsumrechner ........................................ 981

userAcceleration-Eigenschaft ........................... 801

userDirectory-Konstante ..................................... 613

userDomainMask-Konstante ............................ 613

1172

Page 97: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

userInitiated-Enumerationswert .................... 852

usesGroupingSeparator-Eigenschaft ........... 985

usesPreciseCollisionDetection-Eigenschaft .......................................................... 830

utf16-Eigenschaft ....................................................... 194

UTF8Textdateien .............................................................. 621

Zeichenketten ......................................................... 181

utf8-Eigenschaft ......................................................... 193

UUIDs erzeugen ......................................................... 614

uuidString-Eigenschaft .......................................... 614

V

validateMenuItem-Methode .............................. 560

values-Eigenschaft .................................................... 226

var-Schlüsselwort ......................................................... 91

in switch-Konstruktionen ............................... 115

mit if ............................................................................ 108

mit while ................................................................... 119

Variablen ............................................................................ 91

Variablennamen ..................................................... 92

Variadics .......................................................................... 146

velocity-Eigenschaft ................................................ 831

Veränderliche Parameter ...................................... 144

Vererbung ....................................................................... 285

bei Steuerelementen ........................................... 708

eigene UIView-Klasse ......................................... 708

Protokolle ................................................................. 304

Vergleichsoperatoren ................................................ 76

Verschachtelte Funktionen ................................. 138

Versionsabhängiger Code .................................... 116

Versionsnummer ermitteln (iOS/tvOS) ...... 583verticalAlignmentMode-Eigenschaft ........... 791

Verzeichnisseauswählen .................................................. 535, 1051

ermitteln ................................................................... 612

erzeugen ................................................................. 1063

Größe rekursiv ermitteln ................................. 618

Inhalt auflisten ...................................................... 615

löschen .................................................................... 1062

temporäres ........................................................... 1062

Verzeichnistest ....................................................... 618

Verzweigungen ............................................................ 107

videoGravity-Eigenschaft .................................... 750

Videosabspielen ................................................................... 749

aufnehmen .............................................................. 756

auswählen ................................................................ 753

YouTube ..................................................................... 758

Vieleck (SpriteKit) ...................................................... 834View

Größe fixieren ......................................................... 524

schließen (macOS) ............................................... 525

View-Controller ................................................ 405, 494macOS ........................................................................ 515

Root-View-Controller .............................. 405, 411

view-Eigenschaft ............................................. 426, 562viewControllers-Eigenschaft ................... 467, 473viewDidAppear-Methode .......................... 405, 524

Animationen ........................................................... 728

viewDidDisappear-Methode ...... 405, 505, 1051viewDidLayoutSubviews-Methode ................ 406

viewDidLoad-Methode .......................................... 408

Animationen ........................................................... 728

macOS ......................................................................... 501

viewForRow-Parameter ......................................... 992

viewForTableColumn-Parameter .................... 678

viewWillAppear-Methode ......................... 405, 459viewWillDisappear-

Methode ................................ 405, 459, 964, 966viewWillLayoutSubviews-Methode ............... 406

Volumes (SpriteKit) .................................................. 829

W

wait-Methode (SpriteKit-Aktionen) ............... 809

WAV-Format .................................................................. 733

weak-Schlüsselwort .................................................. 280

Beispiel ............................................................ 378, 522

Web-View ........................................................................ 645

Beispiel ....................................................................... 923

NYT-Bestseller-App .............................................. 923

WebKit-Bibliothek ..................................................... 645

Webseiten anzeigen ................................................. 644

im Browser ............................................................... 644

in der App ................................................................. 645

Werttypen ............................................................... 72, 103where-Schlüsselwort

Protokollerweiterungen ................................... 325

Regeln für generische Datentypen ............ 300

switch/case .............................................................. 115

while-Schleife ............................................................... 119

let (Optionals) ............................................. 119, 190

width-Eigenschaft ..................................................... 541

Wildcard-Pattern-Zeichen ....................................... 72

Willkommensbildschirm ..................................... 869

willSet-Funktion .............................................. 254, 288Window-Controller ........................................ 494, 511window-Eigenschaft ................ 411, 514, 524, 562windowDidLoad-Methode ................................... 513

windowNibName-Parameter ............................. 512

windowWillClose-Methode ...................... 510, 514with-Funktion

SpriteKit ..................................................................... 817

UIBezierPath ........................................................... 718

withSize-Methode .................................................... 392

1173

Page 98: Inhaltsverzeichnis - kofler.infoInhaltsverzeichnis 10.4 Sets ..... 226

Index

WKWebView-Klasse .................................................. 645

NYT-Beispiel ............................................................ 926

write-Methode .................................................. 621, 981writeToFile-Methode ............................................... 351

Wuziqi ............................................................................... 997

X

x-Eigenschaft ................................................................ 541

Xcassets-Datei .............................................................. 441UIImage-Objekt erzeugen .............................. 662

Spritekit ...................................................................... 786

Xcode .................................................................................... 24

Arbeitstechniken .................................................. 901

Cache-Verzeichnis ................................................ 909

Code-Konverter ........................................................ 67

Crashkurs ..................................................................... 59

Crashlogs .................................................................. 906

erste Schritte .............................................................. 32

Git .................................................................................. 903

Hello iOS-World .................................................... 370

Literale ........................................................................ 784

mehrsprachige Apps .......................................... 877

Projekte umbenennen ....................................... 906

Verzeichnisse aufräumen ................................ 907

XIB-Datei .............................................................. 406, 506XLIFF-Datei .................................................................... 881

XML-Bibliothek ........................................................... 977

XML-Daten verarbeiten ......................................... 636

XMLAttribute-Klasse ............................................... 637

XMLElement-Klasse ................................................. 637

XMLIndexer-Klasse .................................................. 637

XMLParser-Klasse ........................................... 636, 640XWXMLHash-Bibliothek ....................................... 636

Y

y-Eigenschaft ................................................................ 541

youtube-ios-player-helper-Bibliothek ......... 758

YouTube-Videos abspielen .................................. 758

YTPlayerView-Klasse ............................................... 759

YTPlayerViewDelegate-Protokoll .................... 759

Z

Zahlen ............................................................................... 168

Zeichenketten .............................................................. 181

als Datei lesen/schreiben ................................. 621

Copy-on-Write ........................................................ 184

Länge ........................................................................... 186

sortieren .................................................................... 187

Substrings bequemer lesen ............................. 197

Substrings lesen .................................................... 195

Teilzeichenketten extrahieren ...................... 195

vergleichen ............................................................... 186

zeilenweise zerlegen ........................................... 364

Zeit ...................................................................................... 203

formatieren ............................................................. 748

messen ........................................................................ 206

vergleichen ............................................................... 206

zero-Eigenschaft ........................................................ 175

zip-Funktion ................................................................. 150

Zip2Sequenz-Datentyp .......................................... 150

zPosition-Eigenschaft ............................................. 784

zRotation-Eigenschaft ............................................ 787

Zufallszahlen ................................................................ 171

Zugriffsebenen ............................................................ 243

Zuweisung ......................................................................... 72

Zweidimensionale Arrays ................................. 1002

Zweinamige Parameter ......................................... 142

1174