swift 3 – das umfassende handbuch...swift, mit allen grundlagen und vielen beispiel-apps. in...

56
Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps. In dieser Lese- probe machen Sie sich mit den Operatoren von Swift vertraut und lernen die iOS-Entwicklung anhand eines Hello-World-Programms kennen. Außerdem stellt Ihnen Michael Kofler seine Swift-Version des Spieleklassikers »Breakout« vor. Michael Kofler Swift 3 – Das umfassende Handbuch 1.174 Seiten, gebunden, 2. Auflage 2016 49,90 Euro, ISBN 978-3-8362-4127-4 www.rheinwerk-verlag.de/4115 »Vorwort« »Operatoren« »Hello iOS-World!« »Breakout« Inhaltsverzeichnis Index Der Autor Leseprobe weiterempfehlen Wissen, wie’s geht.

Upload: others

Post on 20-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

LeseprobeDieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps. In dieser Lese- probe machen Sie sich mit den Operatoren von Swift vertraut und lernen die iOS-Entwicklung anhand eines Hello-World-Programms kennen. Außerdem stellt Ihnen Michael Kofler seine Swift-Version des Spieleklassikers »Breakout« vor.

Michael Kofler

Swift 3 – Das umfassende Handbuch1.174 Seiten, gebunden, 2. Auflage 2016 49,90 Euro, ISBN 978-3-8362-4127-4

www.rheinwerk-verlag.de/4115

»Vorwort« »Operatoren« »Hello iOS-World!« »Breakout«

Inhaltsverzeichnis

Index

Der Autor

Leseprobe weiterempfehlen

Wissen, wie’s geht.

“buch” — 2016/11/8 — 8:35 — page 15 — #11

Vorwort

Vorwort

Apples größte Innovation des Jahres 2014 war aus meiner 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

“buch” — 2016/11/8 — 8:35 — page 16 — #12

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

“buch” — 2016/11/8 — 8:35 — page 17 — #13

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

“buch” — 2016/11/8 — 8:35 — page 18 — #14

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 Umgang mit Swift

an sich Zeit, sonderndie Suchenachdengeeigneten Klassen,MethodenundProgram-

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 einlesen mü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

“buch” — 2016/11/8 — 8:35 — page 19 — #15

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

“buch” — 2016/11/8 — 8:35 — page 20 — #16

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

des Manuskript gelesen undmich auf viele Ungenauigkeiten hingewiesen hat.

20

“buch” — 2016/11/8 — 8:35 — page 71 — #67

3

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

“buch” — 2016/11/8 — 8:35 — page 72 — #68

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 = 17i = i * 2let 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 = 3var y = xx=4print(y) // y ist unverändert 3

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

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

72

“buch” — 2016/11/8 — 8:35 — page 73 — #69

3

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 Datena.data = 17print(b.data) // deswegen ist auch b.data 17

Arrays, Dictionaries und Zeichenketten sind Werttypen!

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

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

“buch” — 2016/11/8 — 8:35 — page 74 — #70

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 -Variablevar b = 1.7 // b ist eine Fließkommavariablevar c = a + b // Fehler , Int -Wert + Double -Wert nicht zulässig

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

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

1.7 wird 1.

var c1 = a + Int(b) // c1 = 4var c2 = Double (a) + b // c2 = 4.7

Division durch null

Bei einer Fließkommadivision durch 0.0 lautet das Ergebnis einfach Double.infinitybzw. -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 // Integervar result = i &* i &* i // falsches Ergebnis

// 3.875.820.019.684.212.736

Swift kennt keinenOperator zumPotenzieren. a

bmü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.0var f = pow(e, 3.0) // 7 * 7 * 7 = 343.0

Zeichenketten aneinanderfügen

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

einander:

74

“buch” — 2016/11/8 — 8:35 — page 75 — #71

3

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=3i++ // Fehler , steht in Swift 3 nicht mehr zur Verfügungi+=1 // OK

Inkrement- und Dekrement-Operatoren selbst gemacht

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

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

definieren. Fertigen Code für alle Integer-Datentypen inklusive Int8, Int16, Int32 undInt64 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 28let b = 0b01111 // Wert 15let result = a & b // Wert 12print(String (result , radix:2)) // Ausgabe 1100

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

2

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

n).

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

75

“buch” — 2016/11/8 — 8:35 — page 76 — #72

3 Operatoren

let e = 16let f = e << 2 // entspricht f=e*4, Ergebnis 64let g = e >> 1 // entspricht g=e/2, Ergebnis 8

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

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

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

len.

let rgb: UInt32 = 0x336688let 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 + yx -= y // entspricht x = x - yx *= y // entspricht x = x * yx /= y // entspricht x = x / yx %= y // entspricht x = x % yx <<= y // entspricht x = x << yx >>= y // entspricht x = x >> yx &= y // entspricht x = x & yx &&= y // entspricht x = x && yx |= y // entspricht x = x | yx ||= y // entspricht x = x || yx ^= y // entspricht x = x ^ y

3.2 Vergleichsoperatorenund logischeOperatoren

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

Variablen vergleichen und oft mehrere Vergleiche miteinander kombinieren. Dieser

Abschnitt stellt Ihnen die dazu erforderlichen Operatoren vor.

Vergleichsoperatoren

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

“buch” — 2016/11/8 — 8:35 — page 77 — #73

3

3.2 Vergleichsoperatoren und logische Operatoren

1 == 2 // false1 < 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

“buch” — 2016/11/8 — 8:35 — page 78 — #74

3 Operatoren

class Pt {var x: Double , y: Double// Init -Funktioninit(x: Double , y: Double ){

self.x=xself.y=y

}}

// Operator zum Vergleich von zwei Pt-Objektenfunc ==(left: Pt, right: Pt) -> Bool {

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

// == versus ===var p1 = Pt(x: 1.0 , y: 2.0)var p2 = Pt(x: 1.0 , y: 2.0)p1 == p2 // true , weil die Objekte dieselben Daten enthaltenp1 === p2 // false , weil es unterschiedliche Objekte sind

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 = 12switch n {case (1...10) :

print ("Zahl zwischen 1 und 10")

case(11...20) :print ("Zahl zwischen 11 und 20")

78

“buch” — 2016/11/8 — 8:35 — page 79 — #75

3

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

“buch” — 2016/11/8 — 8:35 — page 80 — #76

3 Operatoren

let obj: Any = 123if obj is UInt32 {

// wird nicht ausgef ührt , weil obj eine Int-Instanz enthältvar myint = obj as! UInt32

}

Upcasts und Downcasts

Ein Grundprinzip der objektorientierten Programmierung ist die Vererbung. Damit

können 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=5a>0 && b<=10 // truea>b || b>a // truelet ok = (a>b) // falseif !ok { // wenn ok nicht true ist, dann ...

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

&& und || führen eine sogenannte Short-Circuit Evaluation aus: Steht nach der 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

“buch” — 2016/11/8 — 8:35 — page 81 — #77

3

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 // 1r.endIndex // 10r.contains (7) // truer.contains (11) // false

81

“buch” — 2016/11/8 — 8:35 — page 82 — #78

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 // true1.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 notprint (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

“buch” — 2016/11/8 — 8:35 — page 83 — #79

3

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-Schreibweiselet result :Stringlet x = 3if x<10 {

result = "x kleiner 10"} else {

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

// verkürzte Schreibweise mit dem ternären Operatorlet x = 3let result = x<10 ? "x kleiner 10" : "x größer gleich 10"

Unwrapping- und Nil-Coalescing-Operator

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

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 nilvar y: Int! = 4 // y enthält eine ganze Zahl oder nilvar z: Int = 5 // z enthält immer eine ganze Zahl

x = nil // oky = nil // okz = nil // nicht erlaubt

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

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

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

83

“buch” — 2016/11/8 — 8:35 — page 84 — #80

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 zuweisenvar 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 diesemAusdruck 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 ()?.propertylet b = optional ?.method1 ()?.method2 ()?.method3 ()

Operator-Präferenz

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

es in der Schule gelernt haben. Generell gilt in Swift eine klare Hierarchie der 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

“buch” — 2016/11/8 — 8:35 — page 85 — #81

3

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

“buch” — 2016/11/8 — 8:35 — page 86 — #82

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 Zahlenstruct Complex {

var re: Doublevar im: Double

// Init -Funktion , um eine neue komplexe Zahl zu erzeugeninit(re: Double , im: Double ) {

self.re=reself.im=im

}}

// Addition komplexer Zahlenfunc + (left: Complex , right: Complex ) -> Complex {

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

86

“buch” — 2016/11/8 — 8:35 — page 87 — #83

3

3.5 Eigene Operatoren

// Multiplikation komplexer Zahlenfunc * (left: Complex , right: Complex ) -> Complex {

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

}

// Vergleich komplexer Zahlenfunc == (left: Complex , right: Complex ) -> Bool {

return left.re == right .re && left.im == right.im}func != (left: Complex , right: Complex ) -> Bool {

return !(left==right)}

// Operatoren anwendenvar a = Complex (re: 2, im: 1) // 2 + ivar b = Complex (re: 1, im: 3) // 1 + 3ivar c = a + b // 3 + 4ivar d = a * b // -1 + 7i

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

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

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

sieht so aus:

// negatives Vorzeichen für komplexe Zahlenprefix func - (op: Complex ) -> Complex {

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

// Anwendungvar e = -d // 1 - 7i

Neuer Vergleichsoperator für Zeichenketten

Für aktuell nicht genutzte Zeichenkombinationen können Sie selbst 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

“buch” — 2016/11/8 — 8:35 — page 88 — #84

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 -Operatorenprecedencegroup ExponentiationPrecedence {

associativity : lefthigherThan : MultiplicationPrecedence

}

// neuer Exponential -Operatorinfix operator ** : ExponentiationPrecedence

// Implementierungfunc ** (base: Double , exponent : Double ) -> Double {

return pow(base , exponent )}

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

88

“buch” — 2016/11/8 — 8:35 — page 89 — #85

3

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

“buch” — 2016/11/8 — 8:35 — page 369 — #365

15

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

“buch” — 2016/11/8 — 8:35 — page 370 — #366

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 IhremProjekt 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

“buch” — 2016/11/8 — 8:35 — page 371 — #367

15

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

“buch” — 2016/11/8 — 8:35 — page 372 — #368

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äter weitere 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

“buch” — 2016/11/8 — 8:35 — page 373 — #369

15

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

“buch” — 2016/11/8 — 8:35 — page 374 — #370

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

“buch” — 2016/11/8 — 8:35 — page 375 — #371

15

15.2 Gestaltung der App

Spracheinstellungen im Simulator

Im Simulator gelten anfänglich englische Spracheinstellungen. Das lässt sich wie auf

einem richtigen Gerät in den Systemeinstellungen beheben. Dazu beenden Sie die

laufende Hello-World-App durch einen 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

“buch” — 2016/11/8 — 8:35 — page 376 — #372

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

“buch” — 2016/11/8 — 8:35 — page 377 — #373

15

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

“buch” — 2016/11/8 — 8:35 — page 378 — #374

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 Touchdynamisch 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

“buch” — 2016/11/8 — 8:35 — page 379 — #375

15

15.3 Steuerung der App durch Code

Abbildung 15.5 Einstellungen für das textView-Outlet

Die resultierende Code-Zeile sieht so aus:

@IBOutlet weak var textView : UITextView !

Damit ist also eine neue Eigenschaft (Klassenvariable) mit dem Namen textView 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 @IBActionund 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 .swiftimport UIKitclass ViewController : UIViewController {

@IBOutlet weak var textView : UITextView !

379

“buch” — 2016/11/8 — 8:35 — page 380 — #376

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

“buch” — 2016/11/8 — 8:35 — page 381 — #377

15

15.4 Actions und Outlets für Fortgeschrittene

Abbildung 15.6 Der Hilfebrowser von Xcode

15.4 Actions und Outlets für Fortgeschrittene

Sie haben nun eine erste Vorstellung davon, 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

“buch” — 2016/11/8 — 8:35 — page 382 — #378

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

“buch” — 2016/11/8 — 8:35 — page 383 — #379

15

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

“buch” — 2016/11/8 — 8:35 — page 384 — #380

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

“buch” — 2016/11/8 — 8:35 — page 385 — #381

15

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

“buch” — 2016/11/8 — 8:35 — page 386 — #382

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

“buch” — 2016/11/8 — 8:35 — page 387 — #383

15

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

“buch” — 2016/11/8 — 8:35 — page 388 — #384

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

“buch” — 2016/11/8 — 8:35 — page 389 — #385

15

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 ohneWeiteres ä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

“buch” — 2016/11/8 — 8:35 — page 390 — #386

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 zumHelloWorld-Button soll 24 Punkte betragen, der rechte

390

“buch” — 2016/11/8 — 8:35 — page 391 — #387

15

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 habemich 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 eingestellten Wertebereich als Fließkom-

mazahl liefert.

391

“buch” — 2016/11/8 — 8:35 — page 392 — #388

15 Hello iOS-World!

// wird bei jeder Slider -Bewegung ausgef ührt@IBAction func sliderMove (_ sender : UISlider ) {

// Testausgabe im Debug -Fensterprint (sender .value)

}

Jetzt geht es nur noch darum, die Schrift des Textfelds entsprechend zu verändern.

Dazu lesen wir mit textView.font? die aktuelle Font-Instanz aus, bilden daraus mit

der Methode withSize eine neue Instanz in der gewünschten Größe und weisen

diese der font-Eigenschaft des Textfelds wieder zu. Da fontWithSize einen CGFloat-

Parameter erwartet, muss die Fließkommazahl von sender.value in den CGFloat-Typ

umgewandelt werden. CGFloat ist auf 32-Bit-Architekturen ein Float, auf 64-Bit-

Architekturen aber ein Double.

@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

“buch” — 2016/11/8 — 8:35 — page 393 — #389

15

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

“buch” — 2016/11/8 — 8:35 — page 394 — #390

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

“buch” — 2016/11/8 — 8:35 — page 395 — #391

15

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

“buch” — 2016/11/8 — 8:35 — page 396 — #392

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

“buch” — 2016/11/8 — 8:35 — page 1065 — #1061

37

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

“buch” — 2016/11/8 — 8:35 — page 1066 — #1062

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

“buch” — 2016/11/8 — 8:35 — page 1067 — #1063

37

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 .swiftoverride func viewDidLoad () {

super .viewDidLoad ()

// Initialisierung des Zufallszahlengeneratorssrand48 (Int(arc4random_uniform (100000000) ))

// Spielszene ladenif let scene = GameScene (fileNamed :"GameScene ") {

let skView = self.view as! SKViewscene.scaleMode = .aspectFillscene.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

“buch” — 2016/11/8 — 8:35 — page 1068 — #1064

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

// Spielstatusvar brickcounter = 0var 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 = 0static let ball:UInt32 = 1static let paddle :UInt32 = 2static let brick:UInt32 = 4static let frame:UInt32 = 8

}

Der gesamte weitere Code befindet sich innerhalb der Klasse GameScene.

Initialisierung der Spielszene

didMove wird zum Einrichten der Spielszene ausgeführt. Der Code sollte ohne weitere

Erklärungen verständlich sein:

1068

“buch” — 2016/11/8 — 8:35 — page 1069 — #1065

37

37.2 Initialisierung

override func didMove (to view: SKView ) {w = self.frame.widthh = self.frame.height

// keine Gravitationself.physicsWorld .gravity = CGVector .zero

// zur Erkennung , wann ein Ball einen Stein trifftself.physicsWorld .contactDelegate = self

// Spielobjekte zusammenstellensetupBricks (rows: 6, cols: 6)setupPaddle ()setupBall ()setupText () // für 'Game Over '

// Ball in Spielraum einsperrenself.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

“buch” — 2016/11/8 — 8:35 — page 1070 — #1066

37 Breakout

func setupBricks (rows: Int, cols: Int) {let brickw = w / CGFloat (cols+1)let brickh = brickw / 3brickcounter = 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 = brickColorbrick.strokeColor = brickColorlet x = brickw * CGFloat (col)let y = h - brickh * CGFloat (row+1)brick.position = CGPoint (x: x, y: y)brick.zPosition = 10brick.name = "brick "self.addChild (brick )

brick.physicsBody =SKPhysicsBody (rectangleOf : brick.frame.size)

with(brick.physicsBody !) {$0.isDynamic = false$0.categoryBitMask = PhysCategory .brick$0.contactTestBitMask = PhysCategory .ball$0.collisionBitMask = PhysCategory .ball

}} // Ende for col

} // Ende for row} // Ende func

Geschwindigkeitsüberlegungen

Die Anzahl der Spielsteine hat bei diesem Spiel einen großen Einfluss auf den 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

“buch” — 2016/11/8 — 8:35 — page 1071 — #1067

37

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 Bildschirmbreitepaddle = SKShapeNode (

rectOf : CGSize (width: w * 0.20 ,height : w * 0.04))

paddle .fillColor = SKColor .redpaddle .strokeColor = SKColor .red

paddle .position =CGPoint (x: w * 0.5 , // mittig

y: h * 0.2) // unteres Viertelpaddle .zPosition = 10self.addChild (paddle )

paddle .physicsBody =SKPhysicsBody (rectangleOf : paddle .frame .size)

with(paddle .physicsBody !) {$0.isDynamic = false$0.categoryBitMask = PhysCategory .paddle$0.collisionBitMask = PhysCategory .ball$0.contactTestBitMask = PhysCategory .none

}}

1071

“buch” — 2016/11/8 — 8:35 — page 1072 — #1068

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 .blackball.strokeColor = SKColor .blackball.position = CGPoint (x: w * 0.25 + w * 0.5 * cRnd() ,

y: h*0.3)ball.zPosition = 10self.addChild (ball)

ball.physicsBody = SKPhysicsBody (rectangleOf : ball.frame.size)with(ball.physicsBody !) {

$0.friction = 0$0.angularDamping = 0$0.linearDamping = 0$0.restitution = 1$0.allowsRotation = false$0.categoryBitMask = PhysCategory .ball$0.collisionBitMask = PhysCategory .brick +

PhysCategory .frame +PhysCategory .paddle

$0.contactTestBitMask = PhysCategory .brick}

}

Der Ball ist anfänglich in Ruhe – er wird erst durch die Berührung des Displays in den

touches-Methoden in Bewegung gesetzt.

1072

“buch” — 2016/11/8 — 8:35 — page 1073 — #1069

37

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 setzenball.physicsBody !.applyImpulse (initialImpulse ())status = .runninglabel.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 einrichtensetupBall ()setupBricks (rows:6, cols:6)ball.physicsBody !.applyImpulse (initialImpulse ())status = .runninglabel.text = ""self.isPaused = false

}}

// Startimpuls für den Ballfunc initialImpulse () -> CGVector {

return CGVector (dx: w * 0.05 , dy: w * 0.05)}

Schläger steuern

Um die Steuerung des Schlägers kümmert sich die touchesMoved-Methode. Relevant

ist dabei nur die X-Koordinate des Berührungspunkts. Sie legt die Position des Schlä-

germittelpunktes fest. Die in GCOperators.swift definierte minMax-Funktion stellt

dabei sicher, dass der Schläger nicht über den Bildschirmrand bewegt wird.

1073

“buch” — 2016/11/8 — 8:35 — page 1074 — #1070

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).xlet xmin = paddle .frame .size.width/2let xmax = self.frame.size.width - xminpaddle .position =

CGPoint (x: minMax (xnew , minimum : xmin , maximum : xmax) ,y: paddle .position .y)

}

touchesEnded und touchesCancelled sind gemäß den Dokumentationsvorgaben 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 istif ball.position .y < paddle .frame.minPoint ().y {

label.text = "Game Over"self.isPaused = truestatus = .lostreturn

}

// manchmal passiert es, dass der Ball sich nur noch// horizontal oder vertikal bewegt ; dann muss man// der Physik ein wenig nachhelfen

1074

“buch” — 2016/11/8 — 8:35 — page 1075 — #1071

37

37.3 Spielsteuerung

if abs(ball.physicsBody !.velocity .dx) <= 0.01 ||abs(ball.physicsBody !.velocity .dy) <= 0.01

{ball.physicsBody !.velocity = CGVector .zeroball.physicsBody !.applyImpulse (initialImpulse ())

}}

Kollisionserkennung

Wenn der Ball einen Stein trifft, wird die Methode didBegin des 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 entfernenbrick.removeFromParent ()

// Spielende ?brickcounter -= 1if brickcounter == 0 {

label.text = "Congratulations !"self.isPaused = truestatus = .won

}}

}

1075

Auf einen Blick

TEIL I

Swift .................................................................................................................................... 21

Teil II

App-Programmierung ................................................................................................... 367

Teil III

Programmier- und Arbeitstechniken ........................................................................ 601

Teil IV

Beispielprojekte ............................................................................................................... 911

Auf einen Blick

“buch” — 2016/11/8 — 8:35 — page 5 — #1

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

“buch” — 2016/11/8 — 8:35 — page 6 — #2

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 Rechnenmit 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

“buch” — 2016/11/8 — 8:35 — page 7 — #3

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

“buch” — 2016/11/8 — 8:35 — page 8 — #4

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

“buch” — 2016/11/8 — 8:35 — page 9 — #5

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 und User-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

“buch” — 2016/11/8 — 8:35 — page 10 — #6

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

“buch” — 2016/11/8 — 8:35 — page 11 — #7

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

“buch” — 2016/11/8 — 8:35 — page 12 — #8

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

“buch” — 2016/11/8 — 8:35 — page 13 — #9

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

“buch” — 2016/11/8 — 8:35 — page 14 — #10

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

“buch” — 2016/11/8 — 8:35 — page 1153 — #1149

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-Parameter

addTarget ................................................................. 426

Gesture Recognizer ............................................. 933

Actions ................................................................... 377, 399

macOS ........................................................................ 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, 951

addOutput-Methode ............................................... 766

addSublayer-Eigenschaft ...................................... 750

addSubview-Methode ...... 426, 516, 1021, 1054

addTarget-Methode ................................................. 426

Adjust-Scroll-View-Insets-Option ................... 919

afconvert-Kommando ........................................... 733

affectedByGravity-Eigenschaft ......................... 831

Aktionen (SpriteKit) ................................................. 804

Aktuelles 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, 1119

SpriteKit ..................................................................... 787

alternate-Eigenschaft .............................................. 542

Ambiguous Use of Function (Fehler-

meldung) ............................................................... 136

anchorPoint-Eigenschaft ........................ 787, 1088

angularDamping-Eigenschaft ............. 831, 1072

angularVelocity-Eigenschaft .............................. 831

animate-Methode ........................................ 725, 1021

animate-Methode (SpriteKit-

Aktionen) ................................................. 807, 1098

Animationen ................................................................ 725

im Spiel 5-Gewinnt ............................................ 1021

Any-Datentyp ............................................................... 315

AnyClass-Datentyp ................................................... 316

AnyObject-Datentyp ............................................... 315

API-Design-Richtlinien .......................................... 143

API-Version testen ..................................................... 116

App

Archiv 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, 923

AppDelegate-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

“buch” — 2016/11/8 — 8:35 — page 1154 — #1150

Index

Apple Developer Program ........................... 24, 393

AppleMovie 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, 837

applyTorque-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) ............................... 953

as-Operator ...................................... 79, 295, 297, 328

Aspect-Fill-Einstellung ................................ 426, 443

Aspect-Fit-Einstellung ................................. 426, 443

assert-Funktion .......................................................... 341

Assets.xcassets-Datei .............................................. 441

Assiciated Values ........................................................ 248

associatedtype-Schlüsselwort ........................... 309

associativity-Schlüsselwort ........................... 87, 88

Assoziative Arrays ..................................................... 225

Assoziativität ................................................................... 84

Asteroids-Spiel .......................................................... 1127

Async-Bibliothek ........................................................ 865

async-Methode ................................................. 635, 852

Trailer-Beispiel ............................................ 688, 689

asyncAfter-Funktion .................................. 855, 1003

Asynchrone Programmierung .......................... 849

Asynchroner Download ........................................ 630

Atlas (SpriteKit) ............................................. 806, 1079

atomically-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) ........ 134

Auto 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, 772

AVCapturePhotoSettings-Klasse ........... 764, 769

AVCaptureSession-Klasse ..................................... 764

AVCaptureVideoPreviewLayer-Klasse .......... 764

AVEncoderAudioQualityKey-Konstante ..... 746

1154

“buch” — 2016/11/8 — 8:35 — page 1155 — #1151

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, 737

backgroundColor-Eigenschaft

(SpriteKit) ........................................................... 1088

Badge-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

Bitmaps

als 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) ....................................................... 829

bodyA/bodyB-Eigenschaft .................................. 818

Bool-Datentyp ............................................................. 172

Boolesche Werte ......................................................... 172

boolValue-Eigenschaft ........................................... 618

borderColor-Eigenschaft ...................................... 407

borderWidth-Eigenschaft ..................................... 407

bounds-Eigenschaft ... 485, 516, 541, 821, 1024

Box2D-Engine .............................................................. 826

break-Schlüsselwort

Schleifen .................................................................... 120

switch .......................................................................... 113

brew-Projekt ................................................................. 898

Bridging-Header-Datei ........................................... 361

brighter-Methode ................................................... 1002

Bundle-Dateien ........................................................... 610

Bundle-ID ....................................................................... 888

in iTunes Connect ................................................ 891

Bundle-Klasse .............................................................. 610

Buttons

iOS ................................................................................. 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, 1021

Camera Roll ................................................................... 761

cameraDevice-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, 737

Maps ............................................................................ 692

capacity-Eigenschaft ............................................... 214

capitalized-Eigenschaft ......................................... 188

Capture List ................................................................... 164

capture-Methode ................................. 764, 769, 772

Capture-Session

Barcodes erkennen ............................................. 772

Fotos aufnehmen ................................................. 763

captureOutput-Methode ...................................... 775

1155

“buch” — 2016/11/8 — 8:35 — page 1156 — #1152

Index

capturePhoto-Methode .............................. 764, 769

Capturing Values ....................................................... 162

Carthage .......................................................................... 357

case-Schlüsselwort ................................................... 112

Casting ................................................................... 295, 328

catch-Schlüsselwort ...................................... 334, 336

categoryBitMask-Eigenschaft ................. 816, 830

cellForRow-Parameter ............................................ 654

CG-Kürzel ........................................................................ 722

CGColor-Struktur ....................................................... 407

CGContext-Klasse ........................................ 723, 1046

CGContextAddArc-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, 541

erweitern ................................................................... 178

CGRect-Struktur ................................... 173, 541, 679

erweitern ................................................................... 177

CGRectMake-Funktion ........................................... 427

CGRectMake-Methode ................................ 679, 993

CGSize-Struktur ............................................... 173, 541

CGVector-Struktur .................................................... 173

changeCurrentDirectoryPath-Methode ..... 614

changeFont-Methode ............................................. 537

Character-Datentyp ................................................. 181

characters-Eigenschaft ................................ 192, 549

CharacterSet-Struktur ............................................ 189

childNode-Methode ................................... 844, 1149

children-Eigenschaft ............................................... 329

class-Schlüsselwort ....................................... 240, 272

clitToBounds-Eigenschaft .................................... 443

CLLocation-Klasse ..................................................... 963

CLLocationManager-Klasse ..................... 693, 698

Kompass .................................................................... 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, 830

Color 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) ..... 714

Compiler ............................................................................ 40

completion-Parameter ............................. 726, 1032

components-Methode ................................ 194, 204

Zeichenketten in Zeilen zerlegen ................ 364

compositingOperation-Eigenschaft .......... 1124

Compound Types ...................................................... 229

Compression Resistance Priority ................... 432

Computed Properties ..................................... 94, 257

Extensions ................................................................ 322

Fehler auslösen ...................................................... 345

preferredContentSize ......................................... 483

prefersStatusBarHidden .................................. 432

Vererbung ................................................................. 289

concludeDragOperation-Methode ...... 565, 576

Concurrent Queues .................................................. 853

Connections Inspector ................................ 653, 673

constrainMaxCoordinate-Parameter ........ 1053

constrainMinCoordinate-Parameter ......... 1053

Constraints (Auto Layout) ......................... 384, 412

contactBitMask-Eigenschaft .............................. 816

contactTestBitMask-Eigenschaft ..................... 831

Containment Segues ............................................... 521

contains-Methode ......... 175, 218, 226, 227, 573

Content Compression ............................................ 422

Content Compression Resistance

Priority ......................................................... 432, 972

1156

“buch” — 2016/11/8 — 8:35 — page 1157 — #1153

Index

Content Hugging ....................................................... 422

Content Hugging Priority .................................... 972

contentMode-Eigenschaft

eigene 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 Öffnen

verhindern) ............................................ 785, 1067

control-Eigenschaft ................................................. 542

Controller ....................................................................... 372

controllers-Eigenschaft ......................................... 803

Convenience Init Function ................................. 265

Vererbung ................................................................. 291

convenience-Schlüsselwort ................................ 265

convert-Methode .............................. 541, 570, 1057

Fonts ............................................................................ 538

Copy-on-Write (Zeichenketten) ........................ 184

copyItem-Methode .................................................. 620

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

Core Location (CL) ..................................................... 693

CoreAudio-Bibliothek ............................................. 732

CoreMotion-Bibliothek ......................................... 800

cornerRadius-Eigenschaft .................................... 407

count-Eigenschaft .......................................... 211, 226

count-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-Eigenschaft

NSTableView ........................................................... 673

UIPickerView .......................................................... 990

UITableView ........................................................... 653

date-Methode

Calendar .................................................................... 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 Inspector

einstellen .................................................... 653, 673

Datentypen

Aliasse ......................................................................... 278

ermitteln ............................................................ 79, 328

Funktionstypen ..................................................... 152

Datum ............................................................................... 203

deadline-Parameter ................................... 855, 1003

decimalSeparator-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, 279

Dekrement-Operator ................................................. 75

delay-Funktion ......................................................... 1003

delegate-Eigenschaft

AVAudioRecorder .................................................. 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

“buch” — 2016/11/8 — 8:35 — page 1158 — #1154

Index

Delegation ................................................ 301, 400, 435

Beispiel für eigenes

Delegation-Protokoll ...................................... 964

CLLocationManagerDelegate-Beispiel ... 698

Connections Inspector ........................... 653, 673

NSTableView ................................................. 673, 677

SetPieceDelegate-Beispiel ............................ 1015

UITableView ............................................................ 653

UITextFieldDelegate-Beispiel ........................ 436

Delete-on-Swipe (UITableView) ........................ 938

deleteRows-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, 946

Designated Init Function ..................................... 265

Vererbung ................................................................. 291

desiredAccuracy-Eigenschaft ............................ 698

destination-Eigenschaft ........................................ 452

detailTextLabel-Eigenschaft ............................... 659

Developer Program .......................................... 24, 393

Device Orientation ................................................... 799

deviceMotionUpdateInterval-Eigenschaft 800

devices-Eigenschaft ................................................. 768

Devie Orientation ..................................................... 799

Dictionaries ................................................................... 225

Dictionary-Datentyp .............................................. 312

didBegin-Methode

Luftballon-Beispiel .............................................. 825

Pac-Man ................................................................. 1116

didBegin-Methode ..................................... 818, 1075

didEnd-Methode ....................................................... 818

didFinishDownloadingTo-Parameter .......... 632

didFinishProcessingPhotoSampleBuffer-

Parameter ............................................................. 769

didMove-Methode .................................................... 459

didReceiveMemoryWarning-Methode ....... 406

didSelectRow-Parameter ...................................... 994

didSet-Funktion ......................... 254, 288, 932, 984

Beispiel .......................................................... 715, 1024

didUpdateFocus-Methode .......... 592, 595, 1151

Trailer-Beispiel ....................................................... 690

discardableResult-Attribut ....................... 133, 360

Disk-Image ..................................................................... 898

dismiss-Methode ............................................ 489, 523

dismissController ...................................................... 525

dismissViewControllerAnimated-

Methode .............................................................. 1032

Dispatch Queue .......................................................... 853

Dispatch-Framework .............................................. 849

DispatchGroup-Klasse ........................................... 855

DispatchQoS.QoSClass-Enumeration .......... 854

DispatchQueue-Klasse .................. 852, 855, 1003

Code imMain-Thread ausführen ............... 635

Trailer-Beispiel ....................................................... 688

DispatchTime-Klasse ................................. 855, 1003

distanceFromLocation-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, 328

Download 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, 1058

draggingExited-Methode .......................... 565, 576

draggingPasteboard-Methode .......................... 575

draggingSession-Methode .......... 566, 571, 1057

draggingUpdated-Methode ................................ 565

drand48-Funktion ....................................... 171, 1005

draw-Funktion .......................................................... 1046

draw-Methode ..................................... 544, 551, 1045

5-Gewinnt-Beispiel ........................................... 1019

Drag&Drop-Beispiel ......................................... 569

Grafikprogrammierung ................................... 709

Hintergrundfarbe ................................................ 713

drawRect-Methode

Schatzsuche/Richtungspfeil .......................... 953

drawsBackground-Eigenschaft ......................... 679

dRnd-Funktion ............................................................ 820

Dropdown-Liste .......................................................... 990

dropFirst-Methode ................................................... 217

dropLast-Methode .................................................... 217

dynamic-Schlüsselwort ......................................... 245

1158

“buch” — 2016/11/8 — 8:35 — page 1159 — #1155

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

Fehler

Absicherung ............................................................ 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, 939

Menüs ......................................................................... 556

Tastatur (iOS) ......................................................... 438

Tastatur (macOS) ................................................. 548

first-Eigenschaft ................................... 195, 211, 217

flagsChanged-Methode ......................................... 549

flashMode-Eigenschaft ......................................... 769

1159

“buch” — 2016/11/8 — 8:35 — page 1160 — #1156

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

Font Manager ........................................................ 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

“buch” — 2016/11/8 — 8:35 — page 1161 — #1157

Index

H

Half-Open-Range-Operator ................................... 81

Hashable-Protokoll ........................................ 225, 312

hasPrefix-Methode ................................................... 186

hasSuffix-Methode ..................................... 186, 1064

Haversine-Formel ..................................................... 963

HDCP-Fehlermeldung ............................................ 752

Header-Code erzeugen .......................................... 902

height-Eigenschaft ................................................... 541

heightOfRow-Parameter ....................................... 678

Heimatverzeichnis ..................................... 613, 1125

HelloWorld

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, 872

High-Score speichern (Asteroids-Spiel) ... 1145

higherThan-Schlüsselwort (Operatoren) ...... 88

Hintergrund-App ............................................ 696, 737

horizontalAlignmentMode-Eigenschaft .... 791

HTTP(S)-Dokument laden .................................... 627

HTTPS-Probleme mit NSURL ............................. 628

Human Interface Guidelines .................. 868, 872

I

IBAction-Attribut ............................................ 360, 379

IBDesignable-Attribut .................................. 360, 721

IBInspectable-Attribut ................................. 360, 721

IBOutlet-Attribut ............................................ 360, 379

Icon .................................................................................. 1037

App ................................................................................ 868

iTunes Connect ...................................................... 892

Resizer ...................................................................... 1037

icon-Eigenschaft (NSAlert) .................................. 536

IconSize-Struktur

(Icon-Resizer-Beispiel) ............................... 1043

id-Datentyp (Objective-C) .................................... 315

if-available-Test ........................................................... 116

if-let-Konstruktion ................................................... 108

Kaskaden .................................................................. 109

kombiniert mit Bedingungen ....................... 110

if-Verzweigungen ....................................................... 107

let (Optionals) ................................... 101, 108, 575

image-Eigenschaft ......................................... 570, 680

Image-Picker-Controller ............................. 753, 761

Image-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) ............ 362

Index-Datentyp ................................................ 189, 195

index-Methode ...................................... 195, 196, 218

IndexPath-Klasse ....................................................... 669

indexPath-Methode ...................................... 669, 958

indexPathForCell-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, 263

Designated 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, 226

insertContentOf-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

“buch” — 2016/11/8 — 8:35 — page 1162 — #1158

Index

intersects-Methode ............................ 175, 573, 813

invalidate-Methode .................................................. 856

iOS

Grundlagen .............................................................. 397

HelloWorld .............................................................. 370

Simulator ....................................................... 374, 696

Versionsnummer ermitteln ........................... 583

iOS-DeviceSupport-Verzeichnis ....................... 908

IP-Adresse ermitteln ................................................ 361

iRnd-Funktion ............................................................. 820

is-Operator .................................................. 79, 297, 328

isBezeled-Eigenschaft ............................................. 679

isDeletableFile-Methode ....................................... 617

isDynamic-Eigenschaft .......................................... 831

isDynamic-Eigenschaft (SpriteKit) ................. 817

isEditable-Eigenschaft ............................................ 679

isEmpty-Eigenschaft .................................... 211, 226

isEnabled-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, 223

JSON-Daten verarbeiten ........................................ 640

jsonObject-Methode ................................................ 641

JSONSerialization-Klasse ...................................... 641

K

Kürzester-Pfad-Problem ..................................... 1113

Kamera wechseln ...................................................... 768

Kanonenkugel (Beispiel) ....................................... 832

Key/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, 703

Kalibrierung ............................................................ 705

Komplexe Zahlen (Operator-Beispiel) ............ 86

Konstanten ....................................................................... 93

Eigenschaften ......................................................... 252

Eulersche Zahl ........................................................ 150

Pi .................................................................................... 150

Kontextmenü .............................................................. 560

Koordinatensystem ................................................. 540

Kreis zeichnen ............................................... 544, 1124

Kreiselkompass ........................................................... 798

Kreisteilungszahl ....................................................... 150

kUTTypeMovie-Konstante .................................. 753

L

Label

break/continue ...................................................... 120

macOS ........................................................................ 499

SpriteKit ..................................................................... 791

Lambda-Ausdruck ..................................................... 156

Landscape-Modus ..................................................... 799

last-Eigenschaft ..................................... 195, 211, 217

lastPathComponent-Eigenschaft .................... 609

Launch Image (tvOS) ............................................... 876

launch-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

Lebenszyklus

App ................................................................................ 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

“buch” — 2016/11/8 — 8:35 — page 1163 — #1159

Index

letters-Eigenschaft .................................................... 189

line-Methode ................................................................ 712

linearDamping-Eigenschaft ................. 831, 1072

lineWidth-Eigenschaft ........................................... 544

SpriteKit ..................................................................... 788

Listen-Steuerelement (iOS) ................................. 651

veränderliche Listen ........................................... 669

Listenfeld ........................................................................ 990

LiteralConvertible-Protokolle ............................ 316

loadRequest-Methode ................................. 645, 923

locale-Eigenschaft .......................................... 200, 203

Locale-Klasse ..................................................... 200, 203

im Playground ....................................................... 200

Localization (l10n) ..................................................... 877

Localization 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, 704

locationManagerShouldDisplay-

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) ................... 853

makeImage-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, 568

Markdown-Kommentare ................................ 30, 45

mass-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, 735

mediaTypes-Eigenschaft ...................................... 753

Mehrblättrige Dialoge ............................................ 527

Mehrdimensionale Arrays .................................. 215

erzeugen ................................................................. 1002

Mehrfachvererbung ................................................. 286

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

deaktivieren ............................................................. 561

Kontextmenüs ....................................................... 560

menu-Eigenschaft

NSApplication ........................................................ 559

NSView ........................................................................ 560

Menubar-App ............................................................... 561

Message-Box ................................................................ 535

messageText-Eigenschaft .................................... 536

Metal .................................................................................. 777

Metatypen ...................................................................... 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) .......................... 744

min-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, 549

Modifizier ....................................................................... 245

Module .................................................................. 243, 355

Modulo-Operator ......................................................... 73

motion-Eigenschaft ................................................. 803

mouseDown-Methode ................... 540, 546, 1057

mouseDragged-Methode ............. 540, 570, 1057

mouseEntered-Methode ....................................... 540

mouseExited-Methode .......................................... 540

1163

“buch” — 2016/11/8 — 8:35 — page 1164 — #1160

Index

mouseUp-Methode .................................................. 540

move-Methode ........................................................... 712

SpriteKit ..................................................................... 805

moveItem-Methode ................................................ 620

moveRowAt-Parameter ......................................... 938

moveXxx-Methoden ............................................... 549

Movie-Trailer-Beispiel ............................................ 682

MP3/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-Controller

weißer Streifen ....................................................... 919

navigationItem-Eigenschaft ............................... 478

Nebenläufige Programmierung ...................... 849

Nested Functions ....................................................... 138

Never-Schlüsselwort ................................................ 140

New York Times (Beispiel-App) ......................... 913

next-Methode .............................................................. 326

nextFocusedItem-Eigenschaft .......................... 595

NextStep ............................................................................. 29

NIB-Datei ......................................................................... 406

Nil ........................................................................................... 83

Nil-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, 1051

NSAppTransportSecurity-Eintrag ................... 628

NSBezierPath-Klasse ....................... 544, 569, 1124

NSBitmapImageRep-Klasse ............................. 1125

NSButton-Klasse ..................................................... 1061

NSCalendar-Klasse .................................................... 204

NSCameraUsageDescription-Key ......... 756, 761

NSCocoaErrorDomain ............................................ 353

NSCoder-Klasse ........................................................... 947

NSCoding-Protokoll ...................................... 406, 947

NSColorPanel-Klasse ............................................... 538

NSColorWell-Steuerelement .............................. 538

NSDate-Klasse .............................................................. 203

NSDictionary-Klasse ................................................ 532

NSDraggingDestination-Protokoll ................. 564

NSDraggingImageComponent-Klasse ......... 570

NSDraggingInfo-Klasse ......................................... 575

NSDraggingItem-Klasse ............................. 565, 570

NSDraggingSource-Protokoll ............... 570, 1057

NSError-Klasse ............................................................. 351

NSEvent-Klasse

Maus ............................................................................ 541

Tastatur ..................................................................... 549

NSEventModifierFlags-Struktur ...................... 542

NSException-Klasse ................................................. 345

NSFileManager-Klasse ......................................... 1062

NSFilenamesPboardType-Konstante . 567, 575

NSFont-Klasse .............................................................. 533

NSFontManager-Klasse .............................. 533, 537

NSFontPanel-Klasse ................................................. 537

NSGradient-Klasse ................................................. 1124

NSHomeDirectory-Funktion ............... 613, 1125

NSImage-Klasse ............................................ 680, 1045

NSImageView-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, 987

NSObject-Klasse .................................... 286, 677, 946

description-Eigenschaft ................................... 311

NSObject-Protokoll .................................................. 949

NSObjectProtocol-Protokoll .................... 286, 949

NSOpenPanel-Klasse ............................................... 536

Datei auswählen ............................................... 1060

Verzeichnisauswahl ......................................... 1051

NSPasteBoard-Klasse .............................................. 575

NSPhotoLibraryUsageDescription-

Key .................................................................. 754, 761

NSPoint-Klasse ............................................................ 570

1164

“buch” — 2016/11/8 — 8:35 — page 1165 — #1161

Index

NSPoint-Struktur ....................................................... 541

NSProgressIndicator-Steuerelement ............ 859

NSRect-Klasse .............................................................. 570

NSRect-Struktur ......................................................... 541

NSRectFill-Methode ................................................. 544

NSRegularExpression-Klasse ............................. 191

NSResponder-Klasse ..................................... 548, 556

NSSavePanel-Klasse ................................................. 536

NSSize-Klasse ............................................................... 570

NSSize-Struktur .......................................................... 541

NSSortDescriptor-Klasse ...................................... 681

NSSplitter-Klasse ....................................................... 530

NSSplitView-Steuerelement ............................ 1039

Delegation ............................................................. 1053

NSSplitViewController-Klasse ........................ 1040

NSSplitViewDelegate-Protokoll ..................... 1053

NSStatusBar-Klasse .................................................. 562

NSString-Datentyp ................................................... 181

NSStringPboardType-Konstante ..................... 567

NSTableView-Steuerelement .............................. 671

NSTableViewDataSource-Protokoll ............... 673

Icon-Resizer-Beispiel ....................................... 1054

NSTableViewDelegate-Protokoll ........ 673, 1056

NSTabViewController-Steuerelement .......... 527

NSTemporaryDirectory-Funktion .... 614, 1062

NSTextField-Steuerelement ..................... 499, 679

NSURL-Klasse ............................................................... 628

NSURLConnection-Klasse .................................... 631

NSUUID-Klasse ........................................................... 614

NSView-Klasse .................................................. 495, 678

NSViewController-Klasse ........................... 495, 515

NSWindow-Klasse .......................................... 495, 500

NSWindowController-Klasse ................... 495, 511

NSWindowDelegate-Protokoll ............... 510, 514

NSWorkspace-Klasse .................................. 644, 1051

NSxxx-Klassennamen ............................................... 29

null-Schlüsselwort ....................................................... 98

NumberFormatter-Klasse .............. 200, 202, 985

numberFromString-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, 360

ObjCBool-Typ ............................................................... 618

objectForKey-Methode .......................................... 981

objectValueForTableColumn-Methode ....... 673

Objektorientierte Programmierung ............. 237

Observer (Eigenschaften) ..................................... 254

Observer (Notification Manager) .................... 951

Oktale Zahlen ............................................................... 168

on-Eigenschaft ............................................................ 728

open-Methode (Webseite öffnen) ........ 644, 645

open-Schlüsselwort ................................................. 243

Operatoren ....................................................................... 71

Assoziativität ............................................................ 84

eigene Operatoren für CGPoint und

CGVector ................................................................ 175

eigener Exponential-Operator ........................ 88

eigener Operatoren für komplexe Zahlen 86

eigener Vergleichsoperator ............................... 87

eigener Vergleichsoperator für

Vektoren ................................................................. 273

Priorität ........................................................................ 84

selbst definieren ....................................................... 86

selbst definieren, Beispiel ................................ 200

Optional Chaining ............................................ 84, 101

Optional Try .................................................................. 339

optional-Schlüsselwort .......................................... 307

Optionale Funktionen/Methoden ................. 307

Optionale Parameter ............................................... 145

Optionale Protokollregeln ................................... 307

Optionals ................................................................... 83, 98

als Rückgabewert von Funktionen ............ 132

doppelte Optionals ............................................. 340

if-let-Kombination .................................... 108, 575

in Kombination mit try .................................... 340

Init-Funktion ........................................................... 266

OptionSet-Protokoll ................................................ 227

orderFrontFontPanel-Methode ........................ 537

orderOut-Methode ................................................... 564

origin-Eigenschaft .................................................... 541

os-Test ............................................................................... 117

Outlets ................................................................... 378, 399

Collections ................................................................ 382

macOS ........................................................................ 502

umbenennen .......................................................... 382

Overloading

Funktionen ............................................................... 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

“buch” — 2016/11/8 — 8:35 — page 1166 — #1162

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

Parsen

Datum 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, 526

Navigation-Controller ...................................... 459

permittedArrowDirections-Eigenschaft .... 484

Photo Library ............................................................... 761

physicalMemory-Eigenschaft ........................... 584

physicsBody-Eigenschaft ..................................... 815

physicsWorld-Eigenschaft ................................... 814

Physik (SpriteKit) ....................................................... 826

Pi-Konstante ................................................................. 150

Picker-View-Steuerelement ...................... 973, 990

Rollover ...................................................................... 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 speichern

NSBitmapImageRep ........................................ 1124

CGImage ................................................................ 1047

Polygone

SpriteKit ..................................................................... 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, 966

position-Eigenschaft ............................................... 783

post-Methode (Notification Manager) ........ 951

postfix-Schlüsselwort ................................................ 87

Potenzieren ...................................................................... 74

pow-Funktion ................................................................. 74

Precedence-Gruppen ......................................... 84, 87

precedencegroup-Schlüsselwort ........................ 88

preferredBarTintColor-Eigenschaft ............... 649

preferredContentSize-Eigenschaft ................. 482

preferredControlTintColor-Eigenschaft ..... 649

preferredFocusEnvironments-Eigen-

schaft ............................................ 596, 1133, 1150

prefersStatusBarHidden-Eigen

schaft .......................................................... 785, 1067

prefix .................................................................................... 87

prefix-Methode ........................................................... 217

prefix-Schlüsselwort .................................................. 87

prepare-Methode ............................................ 452, 522

Detailansicht bei Table-View ........................ 668

Popups auf dem iPhone ................................... 480

prepareToPlay-Methode ....................................... 733

preprareForDragOperation-Methode .......... 565

present-Methode ................................. 485, 490, 649

fü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

“buch” — 2016/11/8 — 8:35 — page 1167 — #1163

Index

private-Schlüsselwort ............................................. 243

Process-Klasse ............................................................. 364

ProcessInfo-Klasse .................................................... 584

Programm

signieren .................................................................... 895

weitergeben ............................................................. 895

Programmende

iOS ................................................................................. 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, 931

propertyList-Methode ............................................ 575

protocol-Schlüsselwort ............................... 303, 330

Protokolle ....................................................................... 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

Prototypzellen

Collection-View ..................................................... 686

Table-View ................................................................ 657

Provisioning Profile ...................................... 393, 886

Pseudo-3D ...................................................................... 778

public-Schlüsselwort ............................................... 243

Punkt versus Pixel .................................................... 412

Pyramide (Beispiel) .................................................. 832

Q

qos-Parameter ............................................................. 852

QR-Codes erkennen ................................................. 772

Quality of Service (async-Methode) 852, 854

Queues (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

Random Numbers .................................................... 171

Range-Datentypen ...................................................... 81

range-Methode (Zeichenketten) ...................... 189

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

rangeOfCharacter-Methode ............................... 189

rate-Eigenschaft .......................................................... 742

RawOptionSetType-Protokoll ........................... 542

rawValue-Eigenschaft ..................................... 96, 248

Read-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, 103

Reflection ....................................................................... 329

Regeln (Auto Layout) ............................................... 412

register-Methode ................................. 531, 532, 567

registerForDraggedTypes-Methode 564, 1050

Reguläre Ausdrücke ................................................. 191

Rekursion ....................................................................... 138

Enumerationen ..................................................... 250

indirekte Enumeration ..................................... 250

Verzeichnisbaum durchlaufen ..................... 618

reloadData-Methode .................................... 669, 681

reloadRows-Methode .............................................. 669

reloadRowsAtIndexPaths-Methode .............. 937

remoteControl-Enumeration ............................ 738

remoteControlReceived-Methode ................. 738

remove-Methode ............................................ 213, 226

removeAllActions-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

“buch” — 2016/11/8 — 8:35 — page 1168 — #1164

Index

replacingOccurrences-Methode ........... 190, 680

representedObject-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

Responder

Menüauswahl ........................................................ 556

Responderkette ..................................................... 553

Tastaturereignisse ............................................... 548

Ressourcen .................................................................... 610

restitution-Eigenschaft ............................ 831, 1072

reStructuredText-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 zwei

Koordinatenpunkten .................................... 963

Right-Shift (bitweises Rechnen) ......................... 75

rightMouseDown-Methode ............................... 540

rightMouseDragged-Methode .......................... 540

rightMouseUp-Methode ....................................... 540

Rollover (Picker-View) ............................................ 992

Root-View-Controller ................................... 405, 411

rootViewController-Eigenschaft 405, 411, 473

rotate-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

Sandbox

iOS ................................................................................. 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) ........................................... 814

Screenshots (Apple TV) .......................................... 581

scrollPosition-Parameter (Table-View) ........ 657

scrollToRow-Methode ................................. 669, 936

scrollXxx-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, 933

Syntax .............................................................. 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, 326

Serielle Queues ........................................................... 853

Set-Datentyp ................................................................ 226

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

uniqueSet-Methode ............................................ 327

set-Schlüsselwort .................................... 94, 257, 276

setAction-Methode (NSColorPanel) .............. 538

1168

“buch” — 2016/11/8 — 8:35 — page 1169 — #1165

Index

setActive-Methode (AVAudioSession) .......... 745

setCategory-Methode ............................................. 745

setDataSouce-Methode ......................................... 677

setDelegate-Methode .............................................. 677

setEditing-Methode ...................................... 670, 934

setFill-Methode ................................................ 712, 953

setLineDash-Methode ............................................ 712

setNeedsDisplay-Methode 546, 569, 715, 1019

setNeedsFocusUpdate-Methode ........ 596, 1150

setObject-Methode ................................................... 981

setRegion-Methode .................................................. 700

setSelectedFont-Methode .................................... 537

setStroke-Methode ........................................ 712, 953

setTarget-Methode (NSColorPanel) ............... 538

setTitle-Methode ........................................................ 934

setVolume-Methode ................................................ 735

SFSafariViewController-Klasse ......................... 645

Shapes (SpriteKit) ...................................................... 788

shared-Methode ................................... 411, 537, 538

sharedApplication-Methode ................ 505, 1051

sharedWorkspace-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, 526

Shuffle-Algorithms ................................................... 224

Signatur ........................................................................... 426

Signatur vonMethoden ........................................ 274

Simulator (iOS) ............................................................ 374

GPS-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, 213

fü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, 763

sourceView-Eigenschaft ........................................ 485

spacing-Eigenschaft ................................................. 429

spctl-Kommando ....................................................... 897

speed-Eigenschaft ..................................................... 832

Speicherplatz ermitteln ........................................ 584

Speicherverwaltung ................................................. 279

Spinner-Steuerelement ......................................... 851

split-Methode .................................................... 194, 223

Split-View ..................................................................... 1039

Delegation ............................................................. 1053

Split-View-Controller ................................. 468, 1040

NYT-Beispiel ............................................................. 924

Splitter-Steuerelement .......................................... 530

splitView-Methode ................................................ 1053

splitViewController-Methode ........................... 476

SpriteKit ........................................................................... 777

srand48-Funktion ........................................ 171, 1005

SSLHandshake 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

“buch” — 2016/11/8 — 8:35 — page 1170 — #1166

Index

startIndex-Eigenschaft .......................................... 195

startRunning-Methode .......................................... 767

starts-Methode ............................................................ 217

startUpdatingHeading-Methode .................... 704

startUpdatingLocation-Methode .................... 698

state-Eigenschaft ............................... 559, 934, 1061

Static Properties ......................................................... 256

static-Schlüsselwort ................................................. 272

Statische Methoden ................................................. 272

Statusbar .............................................................. 562, 785

anzeigen .................................................................... 432

statusItem-Methode ................................................ 562

Steuerelemente

ein- und ausblenden .......................................... 728

selbst programmieren ...................................... 708

stop-Methode .............................................................. 733

Stored Properties ....................................................... 251

Storyboard

Fenster 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, 199

String-Konstruktor ................................................... 168

string-Methode

DateFormatter ...................................................... 203

NumberFormatter ............................................... 200

String.Index-Datentyp ........................................... 195

stringByAppendingPathComponent-

Methode .............................................................. 1062

stringValue-Eigenschaft ............................. 503, 679

stroke-Methode .......................... 544, 569, 712, 953

strokeColor-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

Swift

Compiler ....................................................................... 40

Interpreter ................................................................... 38

Playgrounds für das iPad ................................... 40

Swift-Schlüsselwort ....................................... 148, 178

swift-Versionstest ...................................................... 117

swiftdoc-Dateien ........................................................ 356

swiftmodule-Dateien .............................................. 355

switch-Verzweigungen ........................................... 112

Enumeration ........................................................... 249

Tupel ............................................................................ 230

sync-Methode .............................................................. 857

Syntaktischer Zucker

Generics ..................................................................... 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-Steuerelement

iOS ................................................................................. 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, 678

Icon-Resizer-Beispiel ....................................... 1054

tableViewSelectionDidChange-Methode .. 682

Tag-Eigenschaft (Tab-Bar-Item) ........................ 464

Tap Gesture Recognizer ......................................... 988

Targets (Xcode) ......................................................... 1121

Tastatur (iOS) ..................................................... 375, 433

ausblenden .................................................... 438, 988

einblenden ............................................................... 939

Tastaturfokus setzen ............................... 438, 959

Tastatur (macOS) ........................................................ 547

Teilzeichenketten extrahieren .......................... 195

1170

“buch” — 2016/11/8 — 8:35 — page 1171 — #1167

Index

TelevisionMarkup Language ............................. 579

Temporäre Datei ........................................................ 614

Temporäres Verzeichnis .......................... 614, 1062

Inhalt löschen ......................................................... 757

terminate-Methode .................................... 505, 1051

terminator-Parameter ............................................ 149

Ternärer Operator ........................................................ 82

Beispiel ............................................ 728, 1019, 1029

Terrains (in Tiled) .................................................... 1083

testable-Attribut .............................................. 245, 360

Textdateien .................................................................... 621

Texteingaben (iOS) ................................................... 433

textField-Methode ......................................... 437, 987

textFieldShouldReturn-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, 1080

Tiled-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) ........................................... 876

topViewController-Eigenschaft ........................ 473

touches-Methoden ..................................... 792, 1024

Asteroids-Beispiel .............................................. 1140

Breakout-Spiel ..................................................... 1073

Kanonenkugel-Beispiel ..................................... 836

Pac-Man-Beispiel ............................................... 1101

tvOS .............................................................................. 586

Trackpad .......................................................................... 539

Trailer-Beispiel ............................................................ 682

Trailing 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 .................................................................................. 229

als 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

Typen

Aliasse ......................................................................... 278

Metatypen ................................................................ 330

Typmethoden .............................................................. 272

U

Uhrzeit .............................................................................. 203

UIActionController-Klasse (Beispiel) ............ 966

UIActivityIndicatorView-Steuerelement ... 851

UIAlertAction-Klasse .............................................. 490

UIAlertController-Klasse ...................................... 489

UIApplication-Eigenschaft .................................. 411

UIApplication-Klasse ................................... 410, 645

UIApplicationDelegate-Protokoll ................... 410

UIApplicationMain-Attribut ................... 360, 409

UIBarButtonItem-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

“buch” — 2016/11/8 — 8:35 — page 1172 — #1168

Index

UIFocusUpdateContext-Klasse ......................... 595

UIFont-Klasse ............................................................... 392

UIGestureRecognizerDelegate-

Protokoll ..................................................... 932, 988

UIGraphicsGetCurrentContext-

Methode ................................................................ 723

UIImage-Klasse ........................................................... 662

Bild herunterladen .............................................. 628

UIImagePickerController-Klasse .......... 753, 761

UIImageView-Klasse

Instanz per Code erzeugen ............................. 993

UIImageView-Steuerelement ...... 442, 663, 973

UIKit-Framework ....................................................... 403

UILabel-Steuerelement ......................................... 993

mehrzeiliger Text ................................................. 439

UILongPressGestureRecognizer-

Klasse ............................................................ 932, 934

UINavigationController-Klasse ........................ 456

UInt-Datentyp ............................................................. 168

UIPickerView-Steuerelement ................. 973, 990

Rollover ...................................................................... 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, 429

UIStoryboardSegue-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, 665

UITableViewCellStyle-Enumeration ............. 658

UITableViewController-Klasse .......................... 652

UITableViewDataSource-Protokoll ................ 654

UITableViewDelegate-Protokoll ....................... 656

UITapGestureRecognizer-Klasse ..................... 988

UITextField-Steuerelement ................................ 433

EditingChanged-Ereignis ................................ 989

ValueChanged-Ereignis .................................... 989

UITextFieldDelegate-Protokoll ......................... 436

UITextView-Steuerelement ................................. 407

UITouch-Klasse .............................................. 792, 1024

UIView-Klasse ........................................ 403, 708, 953

Größenänderung feststellen ....................... 1024

Instanz per Code erzeugen ............................. 993

UIViewController-Klasse ........................... 403, 405

Lebenszyklus ........................................................... 405

UIWebView-Steuerelement ................................ 645

NYT-Bestseller-App .............................................. 923

UIWindow-Klasse ........................................... 402, 411

Umrandung eines Steuerelements ................ 407

Unärer Operator ........................................................... 82

unable to simultaneously satisfy

constraints (Fehlermeldung) ................... 427

unarchiveObjectWithFile-Methoden ............ 947

Unbenannte Parameter ........................................ 142

Unicode

Skalar .......................................................................... 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, 453

Popups ........................................................................ 487

Unwrapping-Operator ...................................... 83, 99

Upcast ............................................................................... 295

updateFocusIfNeeded-Methode ........ 596, 1150

uppercased-Methode .............................................. 188

url-Methode

Bundle-Datei ........................................................... 611

URL-Struktur ........................................... 608, 627, 978

URLForRessource-Methode ................................ 532

URLRequest-Klasse ........................................ 645, 923

URLs-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, 981

Asteroids-Spiel .................................................... 1147

Beispiel ....................................................................... 931

Defaultwerte ........................................................... 531

iOS ................................................................................. 603

macOS ......................................................................... 531

Währungsumrechner ........................................ 981

userAcceleration-Eigenschaft ........................... 801

userDirectory-Konstante ..................................... 613

userDomainMask-Konstante ............................ 613

1172

“buch” — 2016/11/8 — 8:35 — page 1173 — #1169

Index

userInitiated-Enumerationswert .................... 852

usesGroupingSeparator-Eigenschaft ........... 985

usesPreciseCollisionDetection-

Eigenschaft .......................................................... 830

utf16-Eigenschaft ....................................................... 194

UTF8

Textdateien .............................................................. 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) ...... 583

verticalAlignmentMode-Eigenschaft ........... 791

Verzeichnisse

auswä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

Videos

abspielen ................................................................... 749

aufnehmen .............................................................. 756

auswählen ................................................................ 753

YouTube ..................................................................... 758

Vieleck (SpriteKit) ...................................................... 834

View

Größe fixieren ......................................................... 524

schließen (macOS) ............................................... 525

View-Controller ................................................ 405, 494

macOS ........................................................................ 515

Root-View-Controller .............................. 405, 411

view-Eigenschaft ............................................. 426, 562

viewControllers-Eigenschaft ................... 467, 473

viewDidAppear-Methode .......................... 405, 524

Animationen ........................................................... 728

viewDidDisappear-Methode ...... 405, 505, 1051

viewDidLayoutSubviews-Methode ................ 406

viewDidLoad-Methode .......................................... 408

Animationen ........................................................... 728

macOS ......................................................................... 501

viewForRow-Parameter ......................................... 992

viewForTableColumn-Parameter .................... 678

viewWillAppear-Methode ......................... 405, 459

viewWillDisappear-

Methode ................................ 405, 459, 964, 966

viewWillLayoutSubviews-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, 103

where-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, 288

Window-Controller ........................................ 494, 511

window-Eigenschaft ................ 411, 514, 524, 562

windowDidLoad-Methode ................................... 513

windowNibName-Parameter ............................. 512

windowWillClose-Methode ...................... 510, 514

with-Funktion

SpriteKit ..................................................................... 817

UIBezierPath ........................................................... 718

withSize-Methode .................................................... 392

1173

“buch” — 2016/11/8 — 8:35 — page 1174 — #1170

Index

WKWebView-Klasse .................................................. 645

NYT-Beispiel ............................................................ 926

write-Methode .................................................. 621, 981

writeToFile-Methode ............................................... 351

Wuziqi ............................................................................... 997

X

x-Eigenschaft ................................................................ 541

Xcassets-Datei .............................................................. 441

UIImage-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, 506

XLIFF-Datei .................................................................... 881

XML-Bibliothek ........................................................... 977

XML-Daten verarbeiten ......................................... 636

XMLAttribute-Klasse ............................................... 637

XMLElement-Klasse ................................................. 637

XMLIndexer-Klasse .................................................. 637

XMLParser-Klasse ........................................... 636, 640

XWXMLHash-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

Wir hoffen sehr, dass Ihnen diese Leseprobe gefallen hat. Sie dürfen sie gerne empfehlen und weitergeben, allerdings nur vollständig mit allen Seiten. Bitte beachten Sie, dass der Funktionsumfang dieser Leseprobe sowie ihre Darstel- lung von der E-Book-Fassung des vorgestellten Buches abweichen können. Diese Leseprobe ist in all ihren Teilen urheberrechtlich geschützt. Alle Nut- zungs- und Verwertungsrechte liegen beim Autor und beim Verlag.

Teilen Sie Ihre Leseerfahrung mit uns!

Dr. Michael Kofler studierte Telematik an der TU Graz. Er zählt zu den erfolgreichsten und vielseitigsten Computer-buchautoren im deutschen Sprachraum. Zu seinen Themen-gebieten zählen neben Java auch Linux, OS X, der Rasp-berry Pi, MySQL, KVM, Visual Basic und Excel-VBA. Viele seiner Bücher wurden übersetzt. Michael Kofler arbeitet auch als Software-Entwickler, Berater sowie als Lehrbeauf-tragter an zwei Fachhochschulen.

Michael Kofler

Swift 3 – Das umfassende Handbuch1.174 Seiten, gebunden, 2. Auflage 2016 49,90 Euro, ISBN 978-3-8362-4127-4

www.rheinwerk-verlag.de/4115

Wissen, wie’s geht.