issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start...

59
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 4 – Das umfassende Handbuch 1.304 Seiten, gebunden, Oktober 2017 49,90 Euro, ISBN 978-3-8362-5920-0 www.rheinwerk-verlag.de/4494 »Vorwort« »Operatoren« »Hello iOS-World!« »Breakout« Inhaltsverzeichnis Index Der Autor Leseprobe weiterempfehlen Wissen, wie’s geht.

Transcript of issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start...

Page 1: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

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

Michael Kofler

Swift 4 – Das umfassende Handbuch

1.304 Seiten, gebunden, Oktober 2017 49,90 Euro, ISBN 978-3-8362-5920-0

www.rheinwerk-verlag.de/4494

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

Inhaltsverzeichnis

Index

Der Autor

Leseprobe weiterempfehlen

Wissen, wie’s geht.

Page 2: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 15 — #11

Vorwort

Apples größte Innovation des Jahres 2014 war aus meiner Sicht weder die Vorstellung der

Apple Watch noch die Auslieferung des Bestsellers iPhone 6. Apple hat sich neben den Arbei-

ten an diesen Produkten einer anderen Baustelle zugewandt und als Reaktion auf die vielen

Mängel, die die rund 20 Jahre alte Programmiersprache Objective-C aufweist, eine vollkom-

men neue Programmiersprache entwickelt: Swift!

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

wir wirklich eine neue Programmiersprache? Doch jemehr Details Apple auf der WorldWide

Developers Conference (WWDC 2014) verriet, desto größer wurde die Begeisterung der teil-

nehmenden Entwickler und der Fachpresse.

Warum Swift?

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

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

che aus den 1980er-Jahren ist, die in keinerlei Hinsichtmitmodernen Programmiersprachen

mithalten kann.

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

C without the C genannt. Natürlich ist Swift von Objective-C beeinflusst – schließlich muss

Swift kompatibel zu denunzähligen Apple-Bibliotheken sein. Swift realisiert viele neue Ideen,

greift aber auch Konzepte von C#, Haskell, Java, Python und anderen Programmiersprachen

auf. Daraus ergeben sichmehrere Vorteile:

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

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

Der resultierende Code ist besser lesbar und wartbar.

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

melt haben, wesentlich leichter zu erlernen als Objective-C. Vorhandenes Know-how lässt

sich einfacher auf Swift als auf Objective-C übertragen.

Swift ist ein Open-Source-Produkt und steht auch für Linux zur Verfügung. Der Entwick-

lungsprozess erfolgt offen und transparent.

Swift ist in den letzten Jahren kometenhaft in die Top-Listen der populärsten Programmier-

sprachen aufgestiegen. Im TIOBE-Index war Swift zuletzt auf Platz 11 vertreten.

15

Page 3: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 16 — #12

Vorwort

Neu in Swift 4

Langjährige Swift-Entwickler haben Swift 3 in schlechter Erinnerung: Unzählige inkompati-

ble Neuerungen erforderten umfassende Änderungen an vorhandenem Code. Wesentlich

besser sieht es bei Swift 4 aus: Ein Großteil der Neuerungen sind Erweiterungen, die keine

Inkompatibilitäten verursachen. Und da, wo doch Code-Änderungen erforderlich sind, küm-

mert sich in der Regel der Code-Konverter von Xcode um die Anpassungen. Kurzum: Die

Anpassung von Swift-3-Code an Swift 4 sollte keine großen Probleme verursachen. Ärger

lauert allerdings an anderer Stelle: Veränderte Frameworks und APIs sowie Methoden und

Klassen, die plötzlich als deprecated gelten, zwingen in manchen Apps zu größeren Umbau-

ten. Das wiederum ist aber nicht die Schuld von Swift.

Was sind nun die wichtigsten Verbesserungen in Swift 4?

Zeichenketten: Der Umgang mit Zeichenketten ist ein wenig komfortabler geworden:

Zum einen lassen sich jetzt sehr elegant mehrzeilige Zeichenketten formulieren, zum

anderen ist die ständige Nennung der Eigenschaft überflüssig, um auf die Sequenz der

Zeichen einer Zeichenkette zuzugreifen. Die neue Substring-Struktur macht die Verarbei-

tung von Teilzeichenketten effizienter. Weitere Optimierungen wurden im Hintergrund

vorgenommen.

Bereiche (Ranges): Bereiche können nun zur einen oder anderen Seite offen formuliert

werden, also in der Form ar[3...] (alle Array-Elemente ab dem vierten) oder s[..<endpos]

(die Teilzeichenkette vom Beginn von s bis zur Position endpos).

Generics:Die Syntax zur Formulierung generischer Ausdrücke wurde an einigen Punkten

erweitert und gibt nunmehr Spielraum als bisher.

JSON-Support: Die Swift-Standardbibliothek wurde um das Protokoll Codable sowie um

diverse verwandte Protokolle und Klassen erweitert. Sie machen esmöglich, eigene Daten-

typen mit minimalem Aufwand im JSON-Format zu speichern bzw. aus JSON-Dateien

wieder einzulesen.

Xcode: Der Code-Editor von Xcode wurde komplett neu implementiert. Das merkt man

an der höheren Geschwindigkeit, an diversen Instabilitäten, vor allem aber daran, dass es

nun endlich Refactoring-Kommandos gibt. Hurra!

Keine Angst vor Swift 5!

Für mich als Autor ist es jedes Jahr ein wenig befremdlich: Ich arbeite mit voller Energie

an der Fertigstellung meines Buchs zu Swift 4, da diskutieren die Entwickler bereits über

Swift 5! Diese Version soll noch mehr Optimierungen beim Umgang mit Zeichenketten

bringen, weitere Generics-Features sowie ein Fundament für asynchrone Programmierkon-

strukte. (Deren vollständige Implementierung ist allerdings erst für Swift 6 geplant.)

Generell ist geplant, inkompatible Änderungen auf ein absolutes Minimum zu beschränken.

Swiftwird also erweitert, aber kaummehr geändert. Insofernmüssen Sie sichnicht vor Swift 5

16

“buch” — 2017/10/6 — 8:49 — page 17 — #13

Vorwort

fürchten: Soweit es wirklich Änderungen gibt, wird der in Xcode integrierte Code-Konverter

in bewährter Manier einen Großteil der Änderungen automatisch durchführen.

Außerdem hat sich bei meiner Arbeit an den drei Auflagen dieses Buchs eines heraus-

kristallisiert: Bei der App-Programmierung kostet nicht der Umgang mit Swift an sich Zeit,

sondern die Suche nach den geeigneten Klassen, Methoden und Programmiertechniken.

Was bietet dieses Buch?

Dieses Buch vermittelt einen kompakten Einstieg in die Programmiersprache Swift in der

Version 4 (Xcode 9). Das Buch ist in vier Teile gegliedert:

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

kennen. Die Themenpalette reicht vom Umgang mit Variablen und elementaren Daten-

typen bis hin zur Syntax der objekt- und protokollorientierten Programmierung.

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

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

Oberflächemit eigenem Swift-Code verbinden, eigene ViewController-Klassen entwickeln,

Apps mit mehreren Dialogen/Views organisieren etc.

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

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

auswerten, Webseiten anzeigen, Steuerelemente mit eigener Grafik gestalten, Listen und

Tabellen in Apps darstellen, geografische Daten auswerten und Spiele mit SpriteKit pro-

grammieren. Sobald Ihre App zufriedenstellend funktioniert, lernen Sie, wie Sie sie taug-

lich für den App Store machen und dort einreichen.

Teil IV zeigt anhand konkreter Beispielprojekte die Praxis der App-Programmierung. Die

Apps decken eine ganze Palette von Themen ab: vom praktischen Währungsumrechner

über den Icon-Resizer bis hin zumehreren Spielen.

Neu in dieser Auflage sind nicht nur Swift-4-Features. Weitere inhaltliche Schwerpunkte sind

Drag&Drop für iOS, die iCloud-Programmierung sowie Server-side Swift.

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

Einen Download-Link finden Sie hier:

www.rheinwerk-verlag.de/4494

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

noch in der App-Entwicklung. Ich setze aber voraus, dass Sie bereits Erfahrungen mit einer

beliebigen Programmiersprache gesammelt haben. Ich erkläre Ihnen in diesem Buch also,

wie Sie in Swift mit Variablen umgehen, Schleifen programmieren und Klassen entwickeln,

aber nicht, wasVariablen sind, wozu Schleifen dienenundwarumKlassendas Fundament der

objektorientiertenProgrammierung sind. So kann ich Swift kompakt undohne viel Overhead

beschreiben und den Schwerpunkt auf die konkrete Anwendung legen.

17

Page 4: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 18 — #14

Vorwort

Leseanleitung

1300 Seiten – das kann schon abschrecken! Dazu besteht aber kein Grund. Ich habe mich

beim Schreiben dieses Buchs bemüht, den Inhalt auf möglichst eigenständige Kapitel zu ver-

teilen, aus denen Sie sich wie aus einem Baukasten bedienen können.

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

lich unumgänglich. Besonders wichtig ist, dass Sie die Swift-spezifischen Eigenheiten beim

Umgang mit elementaren Datentypen und Aufzählungen (Arrays, Dictionaries etc.) kennen-

lernen und das Konzept von Optionals verstehen. Interessanterweise hat sich herausgestellt,

dass Sie für die Entwicklung erster Apps nicht unbedingt alle Feinheiten im Zusammenhang

mit Vererbung, Protokollen etc. beherrschenmüssen. Die Basics reichen zumeist.

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

entwickeln.Wenn Sie bisher Objective-C zur App-Programmierung verwendet haben, werden

Sie in Teil II auf viel bekanntes Wissen stoßen.

Bei Teil III habe ich versucht, oft benötigte Programmiertechniken möglichst losgelöst von

der Zielplattform zu beschreiben. Beispielsweise erfolgt der Umgang mit Dateien unter iOS

ganz ähnlich wie untermacOS. Aus den Kapiteln in Teil III können Sie sich also bedienen, wie

Sie es gerade brauchen.

Viele Detailprobleme treten erst dann auf, wennman den Schritt von kleinen Beispielen hin

zu »richtigen«Appsmacht. Deswegen stellt Teil IV eineReihe vollständiger Projekte vor. Auch

wenn es unwahrscheinlich ist, dass Sie genau so eine App programmierenmöchtenwie eines

der Beispiele aus Teil IV, so werden Sie in diesen Kapiteln vermutlich doch inhaltlich ver-

wandte Anleitungen und Arbeitstechniken mit einem hohen Praxisbezug finden. Probieren

Sie die Apps einfach einmal aus, und blättern Sie dann durch die entsprechenden Kapitel –

Sie werden sicher über Details stolpern, die sich später als hilfreich herausstellen werden.

Viel Spaß bei der App-Entwicklung!

Eine neue Programmiersprache zu erlernen ist immer eine Herausforderung. Noch schwie-

riger ist es, einen Überblick über die schier unüberschaubare Fülle von Bibliotheken zu

gewinnen, die Sie zur App-Entwicklung brauchen. Dieses Buch soll Ihnen bei beiden Aspek-

ten helfen und Ihnen ein solides Fundament vermitteln.

Wenn Sie in die App-Entwicklung mit Swift einsteigen, haben Sie das Privileg, mit einer der

modernsten aktuell verfügbaren Programmiersprachen zu arbeiten. Sobald Sie die ersten

Schritte einmal erfolgreich absolviert haben, wird die Faszination für diese Sprache auch

Sie erfassen. Bei Ihrer Reise durch die neue Welt von Swift wünsche ich Ihnen viel Spaß und

Erfolg!

Michael Kofler (https://kofler.info)

PS: Vielen Dank an Alfred Schilken für sein Feedback zumManuskript!

18

Page 5: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 71 — #67

3

Kapitel 3

Operatoren

Im Ausdruck a = b + c gelten die Zeichen = und + als Operatoren. Dieses Kapitel stellt Ihnen

alle Swift-Operatoren vor – von den simplenOperatoren für die Grundrechenarten bis hin zu

Swift-Spezialitäten wie dem Range-Operator n1...n2.

Leerzeichen vor oder nach Operatoren

Normalerweise ist es nicht notwendig, vor oder nach einem Operator ein Leerzeichen zu

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

nahmen die Regel: Swift kennt bereits standardmäßig ungewöhnlich viele Operatoren, und

wenige Zeilen Code reichen aus, umweitere zu definieren.

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

rator endet und wo der nächste beginnt. Spätestens dannmüssen Sie ein Leerzeichen setzen

– und dann sollten Sie es vor und nach dem Operator setzen! Andernfalls glaubt der Com-

piler nämlich, Sie wollten ihn explizit darauf hinweisen, dass es sich um einen Präfix- oder

Postfix-Operator handelt. Im Detail sind diese Feinheiten in »The Swift Programming Lan-

guage« beim Punkt »Operators« dokumentiert:

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

Swift_Programming_Language/LexicalStructure.html

Wie rasch Probleme auftreten können, zeigt der Vergleich eines Optionals mit nil: DerCompiler betrachtet if opt!=nil als Syntaxfehler, weil er die Anweisung im Sinne von ifopt! = nil interpretiert, also als Kombination zweier Operatoren. Korrekt müssen Sie den

Vergleich in der Form if opt != nil formulieren.

3.1 Zuweisungs- und Rechenoperatoren

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

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

71

Page 6: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 72 — #68

3 Operatoren

Einfache Zuweisung

Der Zuweisungsoperator = speichert in einer Variablen oder Konstanten das Ergebnis des Aus-

drucks:

variable = ausdruck

Vor der ersten Zuweisung an eine Variable bzw. Konstante muss diese mit var bzw. let als

solche deklariert werden:

var i = 17i = i * 2let pi = 3.1415927

Nicht zulässig sindMehrfachzuweisungen in der Art a=b=3. Dafür könnenmehrere Variablen

als Tupel geschrieben und gleichzeitig verändert werden:

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

Das funktioniert auch bei komplexeren Ausdrücken:

let (_, a, (b, c)) = (1, 2, ("x" , "y"))// entspricht var a=2; var b="x"; var c="y"

Der Unterstrich _ ist hier einWildcard Pattern. Es trifft auf jeden Ausdruck zu und verhindert

im obigen Beispiel dessen weitere Verarbeitung.

Wert- versus Referenztypen

Swift unterscheidet bei Zuweisungen zwischen zwei grundlegenden Datentypen:

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

ries sowie struct- und enum-Daten. Bei einer Zuweisung werden die Daten kopiert. Die

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

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

sung wird eine weitere Referenz auf die bereits vorhandenen Daten erstellt. Es zeigen nun

zwei (odermehr) Variablen auf dieselben Daten.

Die folgenden beiden Beispiele verdeutlichen den Unterschied. Im ersten Beispiel werden in

x und y ganze Zahlen gespeichert, alsoWerttypen:

var x = 3var y = xx=4print(y) // y ist unverändert 3

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

Instanz dieser Klasse gespeichert. Bei der Zuweisung b = a wird die Instanz nicht kopiert,

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

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

72

“buch” — 2017/10/6 — 8:49 — page 73 — #69

3

3.1 Zuweisungs- und Rechenoperatoren

class SimpleClass {var data=0

}

var a = SimpleClass ()var b = a // a und b zeigen auf die gleichen Datena.data = 17print(b.data) // deswegen ist auch b.data 17

Arrays, Dictionaries und Zeichenketten sind Werttypen!

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

miersprachen. Beachten Sie aber, dass Arrays und Zeichenketten in Swift Werttypen sind und

nicht, wie in vielen anderen Sprachen, Referenztypen!

Elementare Rechenoperatoren

Diemeisten Rechenoperatoren sind aus dem täglichen Leben bekannt (siehe Tabelle 3.1). Der

Operator % liefert den Rest einer ganzzahligen Division: 13 % 5 ergibt also 3, da 2 * 5 + 3

= 13. Bei Fließkommazahlen wird der Rest zum ganzzahligen Ergebnis ermittelt. 1.0 % 0.4

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

Operator Bedeutung

+ Addition

- Subtraktion

* Multiplikation

/ Division

% Restwert einer ganzzahligen Division

&+ Integer-Addition ohne Überlaufkontrolle

&- Integer-Subtraktion ohne Überlaufkontrolle

&* Integer-Multiplikation ohne Überlaufkontrolle

Tabelle 3.1 Rechenoperatoren

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

typen verwendet werden! Im Gegensatz zu anderen Programmiersprachen erfolgen Typum-

wandlungen nicht automatisch.

73

Page 7: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 74 — #70

3 Operatoren

var a = 3 // a ist eine Integer -Variablevar b = 1.7 // b ist eine Fließkommavariablevar c = a + b // Fehler , Int -Wert + Double -Wert nicht zulässig

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

einer der beiden Operatoren anpassen. Int rundet dabei immer ab, d. h., aus 1.7 wird 1.

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

Division durch null

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

-Double.infinity. Wenn Sie hingegen mit Integerzahlen arbeiten, löst eine Division durch

0 einen Fehler aus.

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

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

besonders effizienter Algorithmen. Sollte allerdings doch ein Überlauf eintreten, dann ist das

Ergebnis falsch!

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

// 3.875.820.019.684.212.736

Swift kennt keinen Operator zum Potenzieren. a

b

müssen Sie unter Zuhilfenahme der Funk-

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

zur Verfügung, wenn Ihr Code import Foundation enthält oder eine andere Bibliothek impor-

tiert, die auf die Foundation zurückgreift. Das trifft unter anderem für Cocoa und UIKit zu.

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

Zeichenketten aneinanderfügen

Der Operator + addiert nicht nur zwei Zahlen, sondern fügt auch Zeichenketten aneinander:

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

Inkrement und Dekrement

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

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

74

“buch” — 2017/10/6 — 8:49 — page 75 — #71

3

3.1 Zuweisungs- und Rechenoperatoren

mit der Begründung, dass die Unterscheidung zwischen der Postfix- und der Präfix-Notation,

also zwischen i++ und ++i, zu viel Verwirrung und oft fehlerhafte Algorithmen verursacht.

Wenn Sie in Swift eine Variable um eins vergrößern oder verkleinern möchten, müssen Sie

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

var i=3i++ // Fehler , steht ab Swift 3 nicht mehr zur Verfügungi+=1 // OK

Inkrement- und Dekrement-Operatoren selbst gemacht

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

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

Fertigen Code für alle Integer-Datentypen inklusive Int8, Int16, Int32 und Int64 sowie alleUInt-Varianten finden Sie z. B. hier auf GitHub:

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

Rechnen mit Bits

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

bitweise. Das folgende Beispiel verwendet die Schreibweise 0b zur Kennzeichnung binärer

Zahlen. String mit dem zusätzlichen Parameter radix:2 wandelt ganze Zahlen in eine Zei-

chenkette in binärer Darstellung um.

let a = 0b11100 // Wert 28let b = 0b01111 // Wert 15let result = a & b // Wert 12print(String (result , radix:2)) // Ausgabe 1100

>> verschiebt die Bits einer Zahl um n Bits nach rechts (entspricht einer Division durch 2n), <<

verschiebt entsprechend nach links (entspricht einer Multiplikationmit 2

n). >>> funktioniert

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

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

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

Zahlen explizit Datentypen ohne Vorzeichen zu verwenden, z. B. UInt32 oder UInt16. Das

folgende Beispiel verwendet 0x zur Kennzeichnung hexadezimaler Zahlen:

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

75

Page 8: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 76 — #72

3 Operatoren

Kombinierte Rechen- und Zuweisungsoperationen

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

mit einer Zuweisung kombiniert werden. Dazu muss dem Operator das Zeichen = folgen.

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

x += y // entspricht x = x + yx -= y // entspricht x = x - yx *= y // entspricht x = x * yx /= y // entspricht x = x / yx %= y // entspricht x = x % yx <<= y // entspricht x = x << yx >>= y // entspricht x = x >> yx &= y // entspricht x = x & yx &&= y // entspricht x = x && yx |= y // entspricht x = x | yx ||= y // entspricht x = x || yx ^= y // entspricht x = x ^ y

3.2 Vergleichsoperatorenund logischeOperatoren

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

vergleichen und oft mehrere Vergleiche miteinander kombinieren. Dieser Abschnitt stellt

Ihnen die dazu erforderlichen Operatoren vor.

Vergleichsoperatoren

Die Vergleichsoperatoren ==, != (ungleich), <, <= sowie > und >= können gleichermaßen für

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

dass auf beiden Seiten des Operators der gleiche Datentyp verwendet wird; Sie können also

nicht eine ganze Zahl mit einer Fließkommazahl vergleichen!

1 == 2 // false1 < 2 // true

"abc" == "abc" // true"abc" == "Abc" // false

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

stimmt. Etwas schwieriger ist die Interpretation von größer und kleiner. Grundsätzlich gelten

Großbuchstaben als kleiner als Kleinbuchstaben, d. h., sie werden beim Sortieren vorne ein-

gereiht. Internationale Zeichen werden auf der Basis der Unicode-Normalform D verglichen.

Die deutschen Buchstaben ä, ö oder ü werden dabei wie eine Kombination aus zwei Zeichen

betrachtet, beispielsweise ä = a". Somit gilt:

76

“buch” — 2017/10/6 — 8:49 — page 77 — #73

3

3.2 Vergleichsoperatoren und logische Operatoren

"A" < "a" // true"a" < "ä" // true"ä" < "b" // true

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

beeinflussen, folgen in Kapitel 8, »Zeichenketten«.

== versus ===

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

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

Hingegen überprüft a==b, ob a und b zwei Objekte mit übereinstimmenden Daten sind. Das

ist nicht das Gleiche! Es ist ja durchausmöglich, dass zwei unterschiedlicheObjekte dieselben

Daten enthalten.

Einschränkungen

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

Werttypen (wie Zahlen, Zeichenketten, Arrays, Dictionaries sowie sonstige Strukturen).

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

det werden, wenn Sie für diese Klassen den Operator == selbst implementieren (Protokoll

Equatable, siehe Abschnitt 12.4, »Standardprotokolle«).

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

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

gleich auch ein Vorgriff auf die Definition eigener Operatoren.

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

self.x=xself.y=y

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

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

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

77

Page 9: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 78 — #74

3 Operatoren

Vergleiche mit ~=

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

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

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

formulierten Zahlenbereich enthalten ist.

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

Achten Sie darauf, dass Sie zuerst den Bereich und dann den Vergleichswert angeben müs-

sen. Wenn Sie die Reihenfolge vertauschen, funktioniert der Operator nicht. Details zu

Range-Operatoren folgen gleich in Abschnitt 3.3.

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

Ausdruck in einem vorgegebenen Bereich befindet:

let n = 12switch n {case (1...10) :

print("Zahl zwischen 1 und 10")

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

default :print("Andere Zahl")

}

Datentyp-Vergleich (»is«)

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

func f(obj: Any) {if obj is UInt32 {

print ("Datentyp UInt32 ")...

}}

Casting-Operator (»as«)

Mit demOperator aswandeln Sie, sofernmöglich, einen Datentyp in einen anderen um. Der

Operator hat in Swift drei Erscheinungsformen:

78

“buch” — 2017/10/6 — 8:49 — page 79 — #75

3

3.2 Vergleichsoperatoren und logische Operatoren

as: In dieser Formeignet sich asnur, wenn der Compiler erkennen kann, dass die Umwand-

lung gefahrlos möglich ist. Das trifft auf alle Upcasts zu, also auf Umwandlungen in

Instanzen einer übergeordneten Klasse (siehe Abschnitt 12.1, »Vererbung«), außerdem bei

manchen Literalen (z. B. 12 as Float).

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

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

Fehler auf.

Mit if let varname = ausdruck as? typ können Sie den Typtestmit einer Zuweisung kom-

binieren. Das funktioniert gleichermaßen für Konstanten (let wie im folgenden Beispiel)

wie auch für Variablen (var):

func f(obj: Any) {if let myint = obj as? UInt32 {

// myint hat den Datentyp UInt32...

} else {print("falscher Datentyp ")

}}

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

sucht. Dabei kann es zu einem Fehler kommen, wenn der Datentyp nicht passt. Insofern

ist diese Variante zumeist nur zweckmäßig, wenn die Typüberprüfung im Voraus erfolgt.

let obj: Any = 123if obj is UInt32 {

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

}

Upcasts und Downcasts

Ein Grundprinzip der objektorientierten Programmierung ist die Vererbung. Damit können

KlassendieMerkmale einer Basisklasseübernehmen und diese erweitern oder verändern. Ein

Objekt einer abgeleiteten Klasse (imKlassendiagrammunten dargestellt) kann immerwie ein

Objekt der Basisklasseverwendet werden (im Klassendiagrammoben). Das nenntman einen

(impliziten) Upcast, also eine Umwandlung in der Klassenhierarchie nach oben.

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

wenn eine Variable vom Typ der Basisklasse tatsächlich ein Objekt der erforderlichen ab-

geleiteten Klasse enthält. Mehr Details zu diesem Thema finden Sie in Abschnitt 12.1, »Ver-

erbung«.

79

Page 10: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 80 — #76

3 Operatoren

Logische Operatoren

Logische Operatoren kombinieren Wahrheitswerte. Wahr UND Wahr liefert wieder Wahr;

Wahr UND Falsch ergibt hingegen Falsch. In Swift gibt es wie in den meisten anderen Pro-

grammiersprachen die drei logischen Operatoren ! (Nicht), && (Und) sowie || (Oder):

let a=3, b=5a>0 && b<=10 // truea>b || b>a // truelet ok = (a>b) // falseif !ok { // wenn ok nicht true ist , dann ...

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

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

des erstenOperanden das Endergebnis bereits fest, wird auf die Auswertung des zweiten Aus-

drucks verzichtet. Wenn im folgenden Beispiel a>b das Ergebnis false liefert, dann ruft Swift

die Funktion calculate gar nicht auf; der logische Ausdruck ist in jedem Fall false, ganz egal,

welches Ergebnis calculate liefern würde.

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

3.3 Range-Operatoren

In Swift gibt es fünf Operatoren, um Zahlenbereiche auszudrücken (siehe Tabelle 3.2). Bei den

ersten beiden Variantenmuss n1 kleiner als n2 sein, sonst ist der Ausdruck ungültig.

Operator Interne Darstellung Bedeutung

n1...n2 CountableRange n1 bis inklusive n2 (1...3 entspricht 1, 2, 3)

n1..<n2 CountableClosedRange n1 bis exklusive n2 (1..<3 entspricht 1, 2)

...n2 PartialRangeThrough vom Anfang bis inklusive n2

..<n2 PartialRangeUpTo vom Anfang bis exklusive n2

n1... CountablePartialRangeFrom von n1 bis zum Ende

Tabelle 3.2 Range-Operatoren

Bei den in Swift 4 eingeführten einseitigen Bereichen hängt der Anfang oder das Ende davon

ab, worauf die Operatoren angewendet werden. Wenn der Bereich auf die Elemente eines

Arrays angewendet wird, dann beginnt ...n2 bzw. ..<n2mit demerstenArray-Element (Index

0). n1... endet mit dem letzten Array-Element. Analog funktioniert dies bei Zeichenketten,

80

“buch” — 2017/10/6 — 8:49 — page 81 — #77

3

3.3 Range-Operatoren

wobei hier anstelle der Zahlen n1 bzw. n2 Elemente der Struktur String.Index verwendet wer-

denmüssen.

Normalerweise werden diese Range-Operatoren für ganze Zahlen bzw. String-Positionen ver-

wendet. Es gibt aber auch Anwendungsfälle für Fließkommazahlen und Zeichenketten.

Intern sind die Range-Operatoren Kurzschreibweisen zur Erzeugung diverser XxxxRange-

Strukturen:

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

Bei beidseitig geschlossen Bereichen lauten die wichtigsten Eigenschaften startIndex und

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

bestimmte Zahl im Zahlenbereich enthalten ist:

var r1 = 1.. <10 // entspricht r = CountableRange <Int >(1.. <10)r1.startIndex // 1r1.endIndex // 10r1.contains (7) // truer1.contains (11) // false

Bei einseitigen Bereichen geben lowerBound bzw. upperBound die obere bzw. untere Grenze an:

let r2 = 17... // entspricht CountablePartialRangeFrom <Int>(17)r2.lowerBound // 17r2.contains (23) // true

Darüber hinaus gibt es unzählige Methoden, um den Zahlenbereich zu verändern (dropFirst,

dropLast, reversed) bzw. um seine Elemente zu verarbeiten (filter, forEach, map):

(1...5) .map { print($0 * 2) } // Ausgabe 2, 4, 6, 8, 10

Range-Operatoren in Schleifen

Mit den Range-Operatoren definierte Bereiche können in Schleifen verarbeitet werden:

for i in 1...10 {print(i) // Ausgabe 1, 2, ... , 10

}

Nach oben offene Bereiche sind ebenfalls als Basis für eine Schleife erlaubt – aber Vorsicht:

ohne break ergibt sich eine Endlosschleife!

for i in 10... {if i>20 {break}print(i) // Ausgabe 10, 11, ... , 20

}

Nach unten offene Bereiche sind in Schleifen nicht erlaubt.

81

Page 11: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 82 — #78

3 Operatoren

Range-Operatoren und Arrays

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

Arrays verwenden:

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

Anstelle des üblichen Zugriffs auf ein Array-Element mit array[n] können Sie auch einen

Bereich für den Zugriff auf mehrere Elemente angeben. Die folgenden Beispiele zeigen die

Anwendung aller fünf Range-Operatoren. Beachten Sie, dass das Ergebnis kein neues Array

ist, sondern eine ArraySlice-Struktur. Beachten Sie auch, dass Array-Indizes immer mit 0

beginnen. array[0] ist also das erste Element, array[...2]meint daher alle Elemente bis zum

dritten. Mehr Informationen zumUmgangmit Arrays folgen in Kapitel 10, »Arrays, Dictiona-

ries, Sets und Tupel«.

let data = ["a", "b", "c", "d", "e"] // Datentyp Array <String >data[2...4] // ["c", "d", "e"], Datentyp ArraySlice <String >data[2.. <4] // ["c", "d"]data[3...] // ["d", "e"]data[...2] // ["a", "b", "c"]data[.. <2] // ["a", "b"]

Range-Operatoren in switch-Konstrukten

Mit dem vorhin schon vorgestellten Operator ~= können Sie testen, ob sich ein Wert inner-

halb eines Bereiches befindet:

1...10 ~= 8 // true...7 ~= 12 // false7... ~= 12 // true...7 ~= 7 // true.. <7 ~= 7 // false7... ~= 8 // true

Analog gilt diese Schreibweise auch in switch-Konstruktionen (siehe Abschnitt 5.3, »Verzwei-

gungen mit switch«):

let n = 21switch n {case .. <10:

print("kleiner als 10")case 10...20:

print("zwischen 10 und 20")case 21...:

print("größer als 20")default :

print("wird nie eintreten , aber syntaktisch erforderlich ")}

82

“buch” — 2017/10/6 — 8:49 — page 83 — #79

3

3.3 Range-Operatoren

Range-Operatoren für Fließkommazahlen

Als Vergleichsbasis für switch bzw. für den Operator ~= dürfen auch Fließkommabereiche

gebildet werden:

1.7.. <2.9 ~= 2.3 // true

Allerdings gelten für Bereiche, derenGrunddatentyp nicht aufzählbar ist, viele Einschränkun-

gen. Beispielsweise ist es unmöglich, Schleifen über sie zu bilden:

Schleifen über einen Fließkommazahlenbereich

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

Sie auf stride zurückgreifen. Diese Funktion stelle ich Ihnen in Kapitel 5, »Verzweigungen

und Schleifen«, vor.

Range-Operatoren für Zeichenketten

Für Vergleiche mit einzelnen Zeichen bzw. in switch-Konstruktionen können Sie auch Zei-

chenbereiche verwenden. Wie bei Fließkommazahlen ist aber eine Anwendung in Schleifen

nicht zulässig.

"a"..."z" ~= "f" // true"0"..."9" ~= "x" // false

Als Start- und Endpunkt der Range-Operatoren sind auch String.Index-Elemente erlaubt.

s[startindex...endindex] liefert allerdings keine neue Zeichenkette, sondern einen Sub-

String:

let s = "Hello World!"if let startindex = s.index(of: " ") {

let part1 = s[.. <startindex ] // Datentyp String .SubSequence , das istlet part2 = s[startindex ...] // ein typealias für Substring

print(part1) // "Hello"print(part2) // " World!"

}

Beachten Sie, dass die Start- und Endpunkte des Bereichs unbedingt als String.Index-Ele-

mente formuliert werden müssen. Der in nahezu allen anderen Programmiersprachen

übliche Zugriff über ganze Zahlen ist in Swift nicht erlaubt (sieht auch Kapitel 8, »Zeichen-

ketten«).

83

Page 12: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 84 — #80

3 Operatoren

3.4 Operatoren für Fortgeschrittene

Die wichtigstenOperatoren kennen Sie nun. Dieser Abschnitt ergänzt Ihr Wissen um Spezial-

und Hintergrundinformationen. Am interessantesten ist dabei sicherlich die Möglichkeit,

selbst eigene Operatoren zu definieren bzw. vorhandene Operatoren zu überschreiben (Ope-

rator Overloading).

Ternärer Operator

Swift kennt drei Typen von Operatoren:

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

len dazu das positive und negative Vorzeichen, das logische NICHT (also !bool) und die

Unwrapping-Operatoren ! und ? zur Auswertung von Optionals (also opt! oder opt?).

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

Swift-Operatoren fällt in diese Gruppe.

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

treter, der daher einfach als der ternäre Operator bezeichnet wird – so, als wären andere

ternäre Operatoren undenkbar.

Die Syntax des ternären Operators sieht so aus:

a ? b : c

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

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

// if-Schreibweiselet result :Stringlet x = 3if x<10 {

result = "x kleiner 10"} else {

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

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

Unwrapping- und Nil-Coalescing-Operator

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

rierte Swift-Variablen nie den Zustand null im Sinne von »nicht initialisiert« annehmen.

Swift bietet dafür die Möglichkeit, eine Variable explizit als Optional zu deklarieren (siehe

84

“buch” — 2017/10/6 — 8:49 — page 85 — #81

3

3.4 Operatoren für Fortgeschrittene

Abschnitt 4.2, »Optionals«). Dazu geben Sie explizit den gewünschten Datentyp an, demwie-

derum ein Fragezeichen oder ein Ausrufezeichen folgt:

var x: Int? = 3 // x enthält eine ganze Zahl oder nilvar y: Int! = 4 // y enthält eine ganze Zahl oder nilvar z: Int = 5 // z enthält immer eine ganze Zahl

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

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

eigentlichen Werts bei y automatisch erfolgt, während es bei x durch ein nachgestelltes Aus-

rufezeichen – den Unwrapping-Operator – erzwungen werden muss. Beachten Sie, dass die

folgenden Zeilen beide einen Fehler verursachen, wenn x bzw. y den Zustand nil aufweist!

var i: Int = x! // explizites Unwrapping durch x!var j: Int = y // automatisches Unwrapping

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

anderen Sprachen null. Optionals sind aber gleichermaßen für Wert- und für Referenztypen

vorgesehen, was in manchen anderen Programmiersprachen nicht oder nur auf Umwegen

möglich ist. Allerdings können nur solche Klassen für Optionals verwendet werden, die das

Protokoll ExpressibleByNilLiteral einhalten.

Mit diesemVorwissen kommenwir nun zumNil-Coalescing-Operator a ?? b, der sich ebenso

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

des folgenden Ausdrucks:

a != nil ? a! : b

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

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

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

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

// k den Wert von x oder den Defaultwert -1 zuweisenvar k = x ?? -1 // der Datentyp von k ist Int

Optional Chaining

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

nil ergibt. Ist dies der Fall, lautet das Endergebnis nil. Andernfalls wird das Ergebnis aus-

gepackt und der nächste Ausdruck angewendet. Wenn dieser ebenfalls ein Optional liefert,

kann auch diesem Ausdruck ein Fragezeichen hintangestellt werden. Swift führt einen wei-

85

Page 13: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 86 — #82

3 Operatoren

teren nil-Test durch. Diese Verkettung von nil-Tests samt Auswertung, wenn der Ausdruck

nicht nil ist, heißt in Swift »Optional Chaining«:

let a = optional ?.method ()?.propertylet b = optional ?.method1 ()?.method2 ()?.method3 ()

Operator-Präferenz

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

der Schule gelernt haben. Generell gilt in Swift eine klare Hierarchie der Operatoren (siehe

Tabelle 3.3). Um die Verarbeitungsreihenfolge zu verändern, können Sie natürlich jederzeit

Klammern setzen – also beispielsweise (a+b)*c.

Priorität Operatoren

BitwiseShiftPrecedence << >>

MultiplicationPrecedence� * / % &*

AdditionPrecedence � + - &+ &- | ^

RangeFormationPrecedence ... ..<

CastingPrecedence is as

NilCoalescingPrecedence ??

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

LogicalConjunctionPrecedence� &&

LogicalDisjunctionPrecedence� ||

DefaultPrecedence (keine zugeordneten Operatoren)

TernaryPrecedence � ?:

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

FunctionArrowPrecedence� ->

Tabelle 3.3 Hierarchie der binären Operatoren

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

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

definiert). Diese bestimmt, ob gleichwertige Operatoren von links nach rechts oder von

rechts nach links verarbeitet werden sollen. Beispielsweise ist - (Minus) ein linksassoziati-

ver Operator. Die Auswertung erfolgt von links nach rechts. 17 - 5 - 3wird also in der Form

(17 - 5)- 3 verarbeitet und ergibt 9. Falsch wäre 17 - (5 - 3) = 15!

86

“buch” — 2017/10/6 — 8:49 — page 87 — #83

3

3.5 Eigene Operatoren

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

im Proposal 0077 nachlesen. Es fasst all die Änderungen zusammen, die in Swift 3 im Bereich

der Operatoren durchgeführt wurden und die seither gelten.

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

precedence.md

3.5 EigeneOperatoren

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

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

neue Operatoren definieren.

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

Funktionsname aus Operatorzeichen besteht. Insofern greift dieser Abschnitt Kapitel 6,

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

Parameter.

Reservierte Operatoren

Die folgenden Zeichen, Zeichenkombinationen bzw. Operatoren sind reserviert und können

nicht verändert werden:

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

Operator Overloading für komplexe Zahlen

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

die Datenstruktur Complex zur Speicherung komplexer Zahlen mit Real- und Imaginärteil

definiert. Die weiteren Zeilen zeigen die Implementierung der Operatoren + und * zur Ver-

arbeitung solcher Zahlen.

// Beispieldatei operator -overloading .playground// Datenstruktur zur Speicherung komplexer Zahlenstruct Complex {

var re: Doublevar im: Double

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

self.re=reself.im=im

}}

87

Page 14: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 88 — #84

3 Operatoren

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

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

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

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

}

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

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

return !(left==right)}

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

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

angegeben werden, ob der Operator vor oder nach demOperanden angegeben wird. Die Defi-

nition des Operators für negative Vorzeichen bei komplexen Zahlen sieht so aus:

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

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

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

Neuer Vergleichsoperator für Zeichenketten

Für aktuell nicht genutzte Zeichenkombinationen können Sie selbst neue Operatoren defi-

nieren. Dazu müssen Sie den Operator mit infix|prefix|postfix operator zuerst definieren

und einer Prioritätsgruppe zuordnen (siehe Tabelle 3.3). Wenn Sie darauf verzichten, zählt Ihr

Operator automatisch zur Gruppe DefaultPrecedence .

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

schen Groß- und Kleinschreibung unterscheidet. infix bezeichnet dabei einen Operator für

88

“buch” — 2017/10/6 — 8:49 — page 89 — #85

3

3.5 Eigene Operatoren

zwei Operanden. Der Operator =~= erhält dieselbe Priorität wie die anderen Vergleichsopera-

toren.

// Datei comparision -operator .swift// neuen Vergleichsoperator definieren , ...infix operator =~= : ComparisonPrecedence

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

zient wäre return left.uppercased()== right.uppercased().

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

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

// ... und ausprobieren"abc" =~= "Abc" // true"äöü" =~= "ÄöÜ" // true

Neuer Exponential-Operator in einer eigenen Prioritätsgruppe

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

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

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

der ebenso neuen Gruppe ExponentiationPrecedence zugeordnet. Diese Gruppe hat eine

höhere Priorität als MultiplicationPrecedence , mehrere aufeinanderfolgende Exponential-

Operatoren werden von links nach rechts verarbeitet.

// Datei comparision -operator .swift

// neue Priorit ätsgruppe für Exponential -Operatorenprecedencegroup ExponentiationPrecedence {

associativity : lefthigherThan : MultiplicationPrecedence

}

// neuer Exponential -Operatorinfix operator ** : ExponentiationPrecedence

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

return pow(base , exponent )}

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

89

Page 15: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 90 — #86

3 Operatoren

Neuer Unwrap-or-Die-Operator

Erica Sadun hat in der Swift-Evolution-Mailing-Liste vorgeschlagen, die Sprache Swift umden

Operator !! zu erweitern, der das Auspacken eines Optionals erzwingt. Gelingt dies nicht,

wird ein Fehler ausgelöst. Die Anwendung dieses Operators sieht so aus:

let result = [1, 2, 3]let firstresult = result .first !! "Fehlermeldung "print(firstresult )

Es gibt also einen optionalen Ausdruck (hier first, liefert nil, wenn das Array leer ist), und

Ihr Code verlässt sich darauf, dass der Ausdruck ein Ergebnis liefert. Sie könnten nun einfach

durch first! das Auspacken erzwingen; sollte aber doch ein Fehler auftreten, dann haben

Sie keine Fehlermeldung. Mit der Konstruktion !! "Fehlermeldung" können Sie hingegen auf

die Ursache des Problems hinweisen. (Der Operator !! ist Ausdrucks des Frusts, den viele

Swift-Entwickler im Umgangmit Optionals und der erforderlichen Absicherung durch guard,

if let etc. empfinden.Mehr Informationen zudiesemThema folgen inAbschnitt 4.2, »Optio-

nals«, sowie in Kapitel 13, »Fehlerabsicherung«.)

Die Swift-Entwicklergemeinde hat sich nicht dazu durchringen können, den Operator zum

Swift-Sprachumfang hinzuzufügen. Aber das können Siemit wenigen Zeilen selbst erledigen:

// Projekt unwrap -or-die -operator , Datei main.swiftinfix operator !!: NilCoalescingPrecedenceextension Optional {

// Idee: Erica Sadun 2017public static func !!(optional : Optional ,

errorMessage : @autoclosure () -> String )-> Wrapped

{if let value = optional { return value }fatalError (errorMessage ())

}}

Details zur Implementierungdieses Operators sowiedieDiskussion in derMailing-Liste samt

einiger alternativer Vorschläge für ähnlich geartete Operatoren finden Sie hier:

https://gist.github.com/erica/423e4b1c63b95c4c90338cdff4939a9b

https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170626/thread.html

Weitere Beispiele für eigene Operatoren

In diesem Buch zeige ich Ihnen inmehreren Abschnitten, wie Sie eigene Operatoren gewinn-

bringend zur Formulierung klareren Codes definieren können:

90

“buch” — 2017/10/6 — 8:49 — page 91 — #87

3

3.5 Eigene Operatoren

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

definieren, um bequem Berechnungen mit Koordinatenpunkten, Vektoren etc. durchzu-

führen.

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

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

definiert.

In Abschnitt 11.5, »Methoden«, habe ich in einem Beispiel, das den Unterschied zwischen

verschiedenenMethodentypen zeigt, auch die Operatoren < und > definiert. Sie ermitteln,

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

91

Page 16: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 373 — #369

15

Kapitel 15

Hello iOS-World!

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

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

tionen von Xcode sowie mit einigen Konzepten der iOS-Programmentwicklung bekannt zu

machen.

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

übergehend in denHintergrund rückt. Natürlichmüssen Sie da und dort ein paar Zeilen Code

schreiben; aber gerade bei den ersten iOS-Programmen geht es vielmehr darum, den effizien-

ten Umgang mit Xcode zu erlernen, die grafische Gestaltung von Apps kennenzulernen und

grundlegende Konzepte der iOS-Programmentwicklung zu verstehen. Dennoch setze ich ab

diesem Kapitel voraus, dass Sie zumindest über elementare Grundkenntnisse in Swift verfü-

gen. Insbesondere die grundlegenden Sprachstrukturen, Datentypen und der Umgang mit

Optionals sollten Ihnen geläufig sein.

Xcode per Video kennenlernen

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

gung das Medium Buch lieben. Aber es heißt ja, ein Bild sagt mehr als tausend Worte, und

man könnte diese Analogie noch fortführen: Ein Video sagtmehr als tausend Bilder.Mitunter

stimmt das sogar, z. B. wenn es darum geht, die Bedienung von Xcode zu erlernen.

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

Tutorial ans Herz legen, das qualitativ meilenweit über den vielen YouTube-Filmchen der Art

»Jetzt lerne ich iOS-Programmierung« steht. Die renommierte Stanford Universität hat eine

mehr als 20-stündige Vorlesung zum Thema »Developing iOS 10 Apps with Swift« kostenlos

im iTunes U-Programm verfügbar gemacht. Um die Videos ansehen zu können, benötigen Sie

entweder iTunes auf Ihrem Mac oder die App iTunesU für das iPad. Grundlegende Englisch-

kenntnisse reichen aus, um dem mit vielen Screencasts unterlegten Vortrag zu folgen. Die

Videos basierenmomentan auf Swift 3.0, es ist aber zu hoffen, dass es 2018 eine aktualisierte

Fassung gibt, die iOS 11 und vor allem Swift 4 berücksichtigt.

https://itunes.apple.com/us/course/developing-ios-10-apps-with-swift/id1198467120

373

Page 17: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 374 — #370

15 Hello iOS-World!

15.1 Projektstart

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

starten Sie in Xcode ein neues Projekt und wählen zuerst den Typ iOS • Single View Appli-

cation. Das ist die einfachste Art von iOS-Apps. Anfänglich besteht eine derartige App aus

einer einzigen Ansicht, also aus einem »Bildschirm«, aus einer »Seite«. Sie können aber spä-

ter problemlos weitere Ansichten hinzufügen. Der anfängliche Projekttyp schränkt Sie also

nicht bei der späterenWeiterentwicklung der App ein.

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

sprache Swift aus. Der Dialog enthält drei Optionen (siehe Abbildung 15.1), die Sie alle drei

nicht aktivieren müssen. (Core Data ist ein Framework, um die App mit einer Datenbank zu

verbinden. Die beiden anderen Optionen betreffen automatisierbare Tests.)

Use Core Data ist nur dann relevant, wenn Sie die Daten Ihrer App in einem Objekt-

Relationen-Mapping-Modell speichernmöchten.

Include Unit Tests und Include UI Tests fügen Ihrem Projekt jeweils ein eigenes Ver-

zeichnis hinzu, in dem Sie Testfunktionen für Ihren Code bzw. für die Benutzeroberfläche

unterbringen können.

Abbildung 15.1 Projektoptionen für das Hello-iOS-Projekt

Zuletzt müssen Sie noch das Verzeichnis angeben, in demXcode die Code-Dateien des neuen

Projekts speichern soll.

374

“buch” — 2017/10/6 — 8:49 — page 375 — #371

15

15.2 Gestaltung der App

15.2 Gestaltungder App

Das neue Projekt besteht aus einer ganzen Reihe von Dateien, deren Namen in der lin-

ken Spalte von Xcode im Projektnavigator zu sehen sind. Sollte Xcode den Projektnavigator

nicht anzeigen, führen Sie Views •Navigator • Project Navigator aus oder drücken ein-

fach (Š)+(1). Im Projektnavigator klicken Sie nun auf die Datei Main.storyboard.

ImHauptbereich von Xcode sehen Sie jetzt das sogenannte Storyboard (sieheAbbildung 15.2).

Anfänglich besteht dieses Drehbuch für iOS-Apps aus nur einer, vorerst leeren Szene, also

einer Bildschirmansicht der App. (Die technische Bezeichnung lautet View-Controller. Details

zur Nomenklatur folgen auf der nächsten Seite.) Bei vielenApps gesellen sich dazu später wei-

tere Seiten, zwischen denen die Anwender dann navigieren können. Im Hello-World-Beispiel

wird es aber bei einer Ansicht bleiben.

Abbildung 15.2 Das Storyboard mit dem einzigen View-Controller der Hello-World-App

Device-Größe

Bei neuen iOS-Apps zeigt Xcode die Ansichten der App im Storyboard so an, wie diese auf

einem iPhone 8 im Hochformat aussehen würden. Wenn Sie in der Fußleiste des Storyboard-

Editors auf View as iPhone 8 klicken, blendet Xcode eine Auswahl von iOS-Geräten mit

anderen Bildschirmformaten ein. Per Knopfdruck können Sie nun zwischen diesen Formaten

wählen (siehe Abbildung 15.2).

375

Page 18: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 376 — #372

15 Hello iOS-World!

Dieses Feature ermöglicht es Ihnen, blitzschnell zu überprüfen, wie Ihre App auf unterschied-

lichen Geräten aussehen wird. Anfänglich wird Ihre App nicht auf die unterschiedlichen

Bildschirmproportionen und -maße reagieren. Abhilfe schaffen sogenannte Layoutregeln, die

ich Ihnen in Abschnitt 15.5, »Layout optimieren«, und detaillierter nochmals in Abschnitt 16.5,

»Auto Layout«, vorstellen werde.

Ich verwende bei der Entwicklung meiner Apps meistens die Device-Größe »iPhone SE«. Das

spart einerseits wertvollen Platz im Storyboard-Editor und gibt mir andererseits eine gute

Vorstellung davon, wie die App auf dem kleinsten infrage kommenden Gerät aussehen wird.

In der Regel ist die Optimierung für kleine Bildschirme schwieriger als die für große.

Mini-Glossar

Bevor Sie damit beginnen, die Hello-World-App zu gestalten, sollten Sie zumindest die

wichtigsten Grundbegriffe aus der iOS-Entwicklerwelt kennen: Eine App kann aus mehre-

ren Ansichten bestehen. Solche Ansichten nennt Xcode Szenen. Jede Szene kann diverse

Steuerelemente enthalten, die das Aussehen der Ansicht bestimmen. Alle Einstellungen aller

Szenen sowie der darin enthaltenen Steuerelemente werden im Storyboard gespeichert.

Jede Szene wirdmit einer Code-Datei verbunden, dem Controller. Im Controller legen Sie fest,

wie Ihre App auf Ereignisse reagiert. Der Controller bestimmt also,wie sich Ihre App verhalten

soll, wenn ein Benutzer einen Button berührt, einen Slider verschiebt etc. Das dem Control-

ler zugrunde liegende Programmiermuster, den Model-View-Controller, stelle ich Ihnen in

Abschnitt 16.1 näher vor.

Standardmäßig enthält ein neues Projekt vom Typ Single ViewApplication die Storyboard-

Datei Main.storyboard mit der Szene View-Controller und dem zugeordneten Controller

in der Datei ViewController.swift. Um später weitere Szenen hinzuzufügen, verschieben

Sie einen View-Controller aus der Xcode-Objektbibliothek in das Storyboard. Während

im Storyboard beliebig viele Szenen gespeichert werden können, benötigen Sie im Regel-

fall zu jeder Szene eine eigene Swift-Code-Datei mit dem Controller. Mitunter können Sie

auch eine Controller-Klasse mehreren ähnlichen Szenen zuordnen. Wie Sie selbst neue

Controller-Klassen einrichten, beschreibe ich in Abschnitt 17.1, »Storyboard und Controller-

Klassen verbinden«.

Vorsicht bei Umbenennungen!

Die grafische Darstellung des Storyboards in Xcode ist sehr ansprechend. Intern handelt es

sich beim Storyboard aber um eine simple XML-Datei. Dabei ist es wichtig zu wissen, dass

die Referenzen vom Storyboard auf Code-Elemente und Komponenten ausschließlich in Form

von Zeichenketten erfolgen.

376

“buch” — 2017/10/6 — 8:49 — page 377 — #373

15

15.2 Gestaltung der App

Die Versuchung ist groß, Outlets, Actions, Klassennamen etc. nachträglich zu verändern,

wenn sich die ursprünglich gewählten Namen als irreführend oder zu wenig prägnant

erweisen. Dabei sollten Sie unbedingt das in Xcode 9 eingeführte Kontextmenükommando

Refactor • Rename verwenden, dessen Funktion auch das Storyboard einschließt. Andern-

falls passen die im Code und die im Storyboard verwendeten Namen nicht mehr zusammen.

Abhilfe schafft dann nur das Neuverbinden von Actions und Outlets. Gerade für Xcode-

Einsteiger ist das schwierig, zumal die wahre Ursache des Problems oft schwer zu erkennen

ist.

Steuerelemente einfügen

Die Benutzeroberfläche unserer Hello-World-App ist anfänglich leer. In die Ansicht sollen

nun zwei Bestandteile (Steuerelemente) eingebaut werden: ein Button mit der Aufschrift

Hello World! und ein leeres Textfeld. Jedes Mal, wenn Sie den Button Hello World! ankli-

cken, soll im Textfeld eine neue Zeile mit dem aktuellen Datum und der Uhrzeit eingefügt

werden (siehe Abbildung 15.3).

Abbildung 15.3 Die Hello-World-App im iOS-Simulator, hier in der iPhone-X-Ausprägung

377

Page 19: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 378 — #374

15 Hello iOS-World!

Xcode zeigt die zur Auswahl stehenden Steuerelemente normalerweise rechts unten in der

Objektbibliothek an. Sollten die Steuerelemente bei Ihnen nicht sichtbar sein, blenden Sie

diesen Bereich der Werkzeugleiste mit View•Utilities • Show Object Library bzw. mit

(ctrl)+(alt)+(Š)+(3) ein.

Xcode kann die Objektbibliothek in einer kompakten Icon-Ansicht oder in einer Listen-

ansicht darstellen. Wechseln Sie gegebenenfalls mit dem Button am unteren Rand der

Objektbibliothek in die übersichtlichere Listenansicht. Im daneben befindlichen Suchfeld

können Sie in der Liste rasch die gewünschten Einträge ermitteln – suchen Sie nach button

bzw. text view.

Klicken Sie zuerst den Button an, und verschieben Sie ihn per Drag&Drop in den quadra-

tischen View-Controller des Storyboards. Platzieren Sie den Button links oben, und ändern

Sie dann den Text von Button zu Hello World (siehe Abbildung 15.2). Wenn Sie möchten,

können Sie im Attributinspektor links oben in der Werkzeugleiste die Button-Schrift etwas

größer einstellen. Den Attributinspektor blenden Sie bei Bedarf mit (alt)+(Š)+(4) ein.

Nun ist das Text-View-Steuerelement an der Reihe: Suchen Sie in der Objektbibliothek nach

diesem Steuerelement, und verschieben Sie es per Drag&Drop in das Storyboard. Platzieren

Sie das Steuerelement unterhalb des Buttons, und stellen Sie die Größe so ein, dass es circa

ein Viertel des quadratischen Storyboards füllt. Wie gesagt, mit den Feinheiten des Layouts

beschäftigen wir uns später. Stellen Sie nun die gewünschte Textgröße ein, und löschen Sie

den Blindtext »Lorem ipsum . . . « im Attributinspektor.

Wenn Sie möchten, können Sie dem Textfeld auch noch eine andere Hintergrundfarbe

zuweisen – dann erkennen Sie später bei der Programmausführung besser die tatsächlichen

Ausmaße des Steuerelements. Zur Farbeinstellung scrollen Sie im Attributinspektor nach

unten, bis Sie relativ weit unten im Bereich View das Feld Background finden.

Ein erster Test mit dem iOS-Simulator

Nachdemwir nundieminimalistischeOberfläche unserer App gestaltet haben, sprichtnichts

dagegen, das Programm ein erstes Mal zu starten. Dazu wählen Sie in der Symbolleiste des

Xcode-Fensters zuerst das Gerät aus, das Sie simulieren möchten. Zur Auswahl steht die gän-

gige iOS-Hardware-Palette.

Ein Klick auf den dreieckigen Run-Button kompiliert das Programm und übergibt es zur

Ausführung an den iOS-Simulator (siehe Abbildung 15.3). Dabei handelt es sich um ein eigen-

ständiges Programm, das getrennt von Xcode läuft. Wie der Name vermuten lässt, simuliert

es ein iPhonebzw. iPad, wobei das zu testende Programmzur Ausführung automatisch instal-

liert wird. Der Simulator ist zumindest für erste Tests gut geeignet. Für »echte« Apps führt an

Tests auf richtiger Hardware aber natürlich kein Weg vorbei.

378

“buch” — 2017/10/6 — 8:49 — page 379 — #375

15

15.2 Gestaltung der App

Spracheinstellungen im Simulator

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

richtigen Gerät in den Systemeinstellungen beheben. Dazu beenden Sie die laufende Hello-

World-App durch einen Klick auf den iPhone-Button (»Home-Button«). Anschließend starten

Sie die vorinstallierte App Settings, navigieren in den Dialog General • Language & Region

und stellen dort die Sprache Deutsch und die Region Germany ein.

Diesen Vorgang müssen Sie für jedes iOS-Gerät wiederholen, das Sie testen möchten. Die

Einstellungenwerden also nicht über alle simulierten Geräte geteilt.

Da die Veränderung der Spracheinstellungen in allen iOS-Geräten recht umständlich ist, bie-

tet Xcode auch die Möglichkeit, mit Product • Scheme • Edit Scheme festzulegen, in welcher

Sprache die App ausgeführt werden soll. Das Hello-World-Kapitel ist aber nicht der richtige

Ort für diese schon recht fortgeschrittenen Funktionen. Details zum Umgang mit Schemes

und zur Entwicklungmehrsprachiger Apps folgen in Abschnitt 31.4.

Im iOS-Simulator können Sie nun den ButtonHelloWorld! anklicken. Das Programmwird

darauf aber nicht reagieren, weil der Button ja noch nicht mit Code verbunden ist. Wenn

Sie das Textfeld anklicken, können Sie über die Tastatur Ihres Computers sowie über die im

Simulator eingeblendete Bildschirmtastatur Text eingeben. Die Test-App läuft, bis Sie sie in

Xcodemit dem Stopp-Button beenden.

Ärger mit der Tastatur

Sie können im iOS-Simulator mit der Tastatur Ihres Computers Eingaben durchführen. Das

ist effizient, aber nicht realitätsnah: Der Simulator betrachtet Ihre Tastatur als mit dem iOS-

Gerät verbunden und blendet deswegen die iOS-Bildschirmtastaturaus.Mit dem Kommando

Hardware • Keyboard •Connect Hardware Keyboard im iOS-Simulator können Sie auswäh-

len, ob Sie Ihre Computertastatur oder die Bildschirmtastatur von iOS verwenden möchten.

Sobald die iOS-Bildschirmtastatur einmal im iOS-Simulator erscheint, tritt ein weiteres Pro-

blem auf: Es scheint keine Möglichkeit zu geben, die Tastatur wieder loszuwerden. Das ist

das in iOS vorgesehene Verhalten – wenn die Eingabe abgeschlossen ist, muss die Tasta-

tur per Code explizit ausgeblendet werden, in der Regel durch die Anweisung view.end-Editing(true). Im Hello-World-Projekt verzichten wir darauf.

Praktische Details zum richtigen Umgang mit Textfeldern folgen in Abschnitt 16.9, »Textein-

gaben«, sowie in mehreren Beispielprojekten in Teil IV dieses Buchs.

379

Page 20: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 380 — #376

15 Hello iOS-World!

15.3 Steuerungder App durch Code

Damit das Berühren des Buttons auf einem iPhone bzw. das Anklicken des Buttons im Simu-

lator eine sichtbareWirkung zeigt, soll die App jetzt so erweitert werden, dass in das Textfeld

jedes Mal eine Zeile mit dem Datum und der aktuellen Uhrzeit eingefügt wird. Das erfordert

einige Zeilen Swift-Code.

Den Buttonmit einer Methode verbinden (Actions)

Mit der App-Ansicht (Szene) verbundener Code muss nun in die bereits vorgesehene Datei

ViewController.swift eingetragen werden. Xcode unterstützt diesen Vorgang, sofern das

Storyboard und die damit verbundene Datei ViewController.swift nebeneinander angezeigt

werden. Genau das bewirkt der Button mit den »Eheringen«: Er blendet zur gerade aktiven

Datei den sogenannten Assistenzeditor ein, also eine zugeordnete zweite Datei.

Platz sparen in Xcode

Wenn Sie nicht gerade auf einem sehr großen Monitor arbeiten, wird der Platz in Xcode

jetzt knapp. Links sitzt der Projektnavigator, in der Mitte das Storyboard und der Code des

Controllers und rechts noch die Werkzeugleiste – das ist zu viel! Blenden Sie deswegen vor-

übergehend die beiden Seitenleisten aus. Die entsprechenden Buttons finden Sie rechts oben

in der Xcode-Symbolleiste.

ViewController.swift enthält den Swift-Code für eine Klassemit demNamen ViewController.

Diese Klasse ist von der UIViewController-Klasse abgeleitet. Wie der Name vermuten lässt,

steuert diese Klasse das App-Erscheinungsbild. Der View-Controller enthält bereits zwei leere

Methoden. Diese sind für uns vorerst aber nicht von Interesse; wenn Siemöchten, können Sie

sie löschen. In diesemHello-World-Beispiel benötigen wir sie nicht.

Dafür möchten wir nun eine Methode in den Code einbauen, die ausgeführt wird, wenn

der Button Hello World angeklickt wird. Dazu drücken Sie die Taste (ctrl) und ziehen den

Button vom Storyboard in den Assistenzeditor. Die Methode soll direkt in der Klasse und

nicht innerhalb einer anderen Methode eingefügt werden. Achten Sie darauf, die Maus- bzw.

Trackpad-Taste an der richtigen Stelle loszulassen! Bis dahin markiert eine blaue Linie die

Verbindung, die Sie herstellenmöchten.

Sobald Sie die Maus bzw. das Trackpad losgelassen haben, erscheint ein Dialog, in dem Sie

die Details der Verbindung einstellen können (siehe Abbildung 15.4). Für uns sind folgende

Einstellungen zweckmäßig:

Connection = Action: Wir wollen auf ein Ereignis reagieren. Der Begriff Action bezieht

sich dabei auf das Target-Action-Entwurfsmuster, bei dem eine Methode in die eigene

Controller-Klasse eingebaut wird. Sie gilt als »Ziel«, das angesprungen wird, wenn das ent-

sprechende Ereignis auftritt.

380

“buch” — 2017/10/6 — 8:49 — page 381 — #377

15

15.3 Steuerung der App durch Code

Object: Das Feld gibt das Basisobjekt der Aktion an. Die Voreinstellung lautet View Con-

troller und bleibt immer unverändert.

Name: Hier geben wir der zu erstellenden Methode einen möglichst aussagekräftigen

Namen. Ich habe mich bei diesem Beispiel für hwButtonTouch entschieden. Wenn Sie das

Beispiel selbst ausprobieren, können Sie hier einen beliebigen anderen Namen wählen.

Type =AnyObjectoderUIButton: Diese Einstellung gibt an, inwelcher FormDaten an die

Methode übergeben werden sollen. Im Hello-World-Beispiel werten wir diese Daten aber

ohnehin nicht aus – insofern ist die Einstellung egal. Wollten wir den Text des Buttons

oder andere Eigenschaften auslesen, wäre es zweckmäßig, hierUIButton einzustellen.

Event = Touch Up Inside: Hier wird festgelegt, auf welches Ereignis wir reagieren möch-

ten. Die Defaulteinstellung passt hier: Wenn der Button innen berührt wird, soll unser

Code ausgeführt werden.

Arguments = Sender: In der Auswahlliste können Sie festlegen, welche Daten an die

Methode übergeben werden sollen. Zur Auswahl stehen Sender, Sender and Event oder

None. Die Einstellung Sender bedeutet, dass eine Referenz auf das Objekt übergeben wird,

das die Aktion ausgelöst hat. Das vereinfacht die Auswertung der Daten dieses Objekts –

insbesondere dann, wenn Sie eine Action-Methode mit mehreren Steuerelementen ver-

binden.

Abbildung 15.4 Der Button des Storyboards (links) wird durch ctrl-Drag mit einer neuenMethode

im ViewController-Code (rechts) verbunden.

381

Page 21: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 382 — #378

15 Hello iOS-World!

Die hier so langatmig beschriebenen Einstellungen nehmen Sie mit etwas Übung in gerade

mal 15 Sekunden vor. Xcode belohnt diese Arbeit mit einer Methodendefinition, die aus zwei

Zeilen Code besteht:

// Projekt hwios -world , Datei ViewController .swift@IBAction func hwButtonTouch (_ sender : UIButton ) {

// todo: Code verfassen}

Der Code allein reicht nicht!

Angesichts des doch recht umständlichen Mausgeklickes liegt es nahe, den wenigen Code

einfach selbst einzutippen. Das ist aber keine gute Idee! Mit dem Code an sich ist es näm-

lich nicht getan. Hinter den Kulissenmerkt sich Xcode auch,mit welchem Steuerelement und

mit welchem Ereignis die Methode verknüpft ist. Diese Metadaten landen in der XML-Datei

Main.storyboard. Die Verbindung stellt Cocoa Touch dynamisch zur Laufzeit her. Das kompi-

lierte Storyboard enthält dafür eine Referenz auf den serialisierten View-Controller und den

Selektor auf die Methode.

Zugriff auf das Textfeld über eine Eigenschaft (Outlets)

Bevor wir die Methode hwButtonTouch mit konkretem Code füllen können, benötigen wir

noch eineMöglichkeit, um auf das Textfeld zuzugreifen. Dazu stellenwir eine weitere Verbin-

dung zwischen der App-Ansicht im Storyboard und dem Code her: Wieder mit (ctrl) ziehen

wir diesmal das Text-View-Steuerelement in den Codebereich, verwenden diesmal aber

andere Einstellungen (siehe Abbildung 15.5):

Connection = Outlet: Wir wollen auf das Steuerelement zugreifen können. Xcode soll

also eine entsprechende Eigenschaft in die ViewController-Klasse einbauen, die auf das

Objekt verweist. In der iOS-Nomenklatur wird das alsOutlet bezeichnet.

Object: Das Feld gibt das Basisobjekt der Aktion an. Die Voreinstellung View Controller

kann nicht geändert werden.

Name: Das ist der Name, unter demwir das Steuerelement ansprechenmöchten. Ich habe

textView angegeben.

Type =UITextView: Das Steuerelement ist eine Instanz der UITextView-Klasse – und unter

diesem Typmöchten wir auf das Steuerelement auch zugreifen.

Storage =Weak: Hier geht es darum, ob die Referenz auf das Steuerelement sicherstellt,

dass dieses im Speicher bleibt. Das ist nicht notwendig: Das Steuerelement kommt uns

sicher nicht abhanden. Insofern können wir die Defaulteinstellung Weak bedenkenlos

übernehmen.

382

“buch” — 2017/10/6 — 8:49 — page 383 — #379

15

15.3 Steuerung der App durch Code

Abbildung 15.5 Einstellungen für das textView-Outlet

Die resultierende Code-Zeile sieht so aus:

@IBOutlet weak var textView : UITextView !

Damit ist also eine neue Eigenschaft (Klassenvariable) mit dem Namen textView definiert.

Wir können mit ihr auf ein Steuerelement vom Typ UITextView zugreifen, wobei der Typ

als Optional angegeben ist. Der Grund dafür ist, dass die Initialisierung des Steuerelements

möglicherweise nicht sofort beim App-Start, sondern erst etwas später erfolgt. Indem die

Eigenschaft als Optional deklariert ist, wird klar, dass ein Zugriff auf das Steuerelement unter

Umständen noch gar nicht möglich ist.

Die Attribute »@IBAction« und »@IBOutlet«

Sicher ist Ihnen aufgefallen, dass Xcode die Methode mit dem Attribut @IBAction und die

Eigenschaft mit dem Attribut @IBOutlet gekennzeichnet hat. Der Interface Builder erkennt

anhand dieser Attribute, zu welchen Elementen der Programmierer Verbindungen erlaubt

bzw. herstellen darf. Der Interface Builder ist jener Teil von Xcode, der zur Gestaltung grafi-

scher Benutzeroberflächen dient.

Endlich eigener Code

Sie können dieApp zwischenzeitlich noch einmal starten. AmVerhalten der App hat sich aber

nichts verändert. Die Methode hwButtonTouch ist ja noch leer, und auch die zusätzliche Eigen-

schaft textView ist noch ungenutzt. Aber das ändert sich jetzt endlich! Jedes Mal, wenn der

Button Hello World berührt wird, soll das Textfeld um eine Zeile mit Datum und Uhrzeit

ergänzt werden. In einer ersten Testversion könnte der Code wie folgt aussehen:

// Projekt Hello iOS, Datei ViewController .swiftimport UIKitclass ViewController : UIViewController {

@IBOutlet weak var textView : UITextView !

383

Page 22: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 384 — #380

15 Hello iOS-World!

@IBAction func hwButtonTouch (_ sender : UIButton ) {let now = Date()

// zur Formattierung des Datumslet formatter = DateFormatter ()formatter .dateFormat = "d.M.yyyy H:mm:ss"

// Text im Text -View -Steuerelement hinzuf ügentextView .text? += formatter .string (from: now) + "\n"

}}

Auf den Abdruck der standardmäßig vorhandenen, aber leeren Methoden viewDidLoad und

didReceiveMemoryWarning habe ich verzichtet. In diesem Beispiel können Sie diese Methoden

aus dem Code löschen, wir brauchen sie nicht.

Outlets wie die Eigenschaft textView sind Optionals. Es liegt in der Natur von Optionals, dass

diese den Zustand nil haben können. Tatsächlich ist dies aber nur vor der Initialisierung der

Ansicht der Fall. Sobald die Ansicht auf einem iOS-Gerät sichtbar wird und Action-Methoden

ausführen kann, können Sie sich darauf verlassen, dass Outlet-Eigenschaften nicht nil sind.

Genau genommen gilt dies ab dem Zeitpunkt, zu dem im View-Controller die Methode

viewDidLoad ausgeführt wurde (siehe Abschnitt 16.3, »Die UIViewController-Klasse«).

Hintergrundinformationen zum Umgang mit Datum und Uhrzeit können Sie bei Bedarf in

Kapitel 9 nachlesen. Somit bleibt nur noch der Ausdruck textView.text zu erklären: Ein Blick

in die Dokumentation des UITextView-Steuerelements zeigt, dass der Inhalt des Textfelds

über die Eigenschaft text gelesen und verändert werden kann. Der Datentyp von text lautet

String?, es handelt sich also um ein Optional, das beim Zugriff explizit durch ein nachgestell-

tes Fragezeichen oder Ausrufezeichen ausgepackt werden muss.

Der schnellste Weg zur Dokumentation

Wenn Sie zum ersten Mal ein UITextView-Steuerelement nutzen, kennen Sie die Elemente

dieser Klasse noch nicht. Eine kurze Beschreibung der Klasse erhalten Sie, wenn Sie das

Schlüsselwort UITextView im Code zusammenmit (alt) anklicken. Am unteren Rand der ein-

geblendeten Infobox befindet sich ein Link auf die Klassenreferenz, die in einem eigenen

Fenster geöffnet wird (siehe Abbildung 15.6).

Jetzt ist es höchste Zeit, die App im Simulator endlich auszuprobieren. Einige Klicks auf den

Button beweisen, dass das Programmwie erwartet funktioniert (siehe Abbildung 15.3). Einen

Preis für innovatives Layout wird es freilich nicht gewinnen.

384

“buch” — 2017/10/6 — 8:49 — page 385 — #381

15

15.4 Actions und Outlets für Fortgeschrittene

Abbildung 15.6 Der Hilfebrowser von Xcode

15.4 Actions und Outlets für Fortgeschrittene

Sie haben nun eine erste Vorstellung davon, wozu Actions und Outlets verwendet werden.

Dieser Abschnitt weist auf einige Besonderheiten im Umgang mit Actions und Outlets hin.

Eine Action für mehrere Steuerelemente

Es ist zulässig, ein und dieselbe Action-Methode für mehrere Steuerelemente zu verwenden.

Dazu richten Sie zuerst für ein Steuerelement dieMethode ein. Danach führen Sie eine (ctrl)-

Drag-Operation für das zweite Steuerelement aus, wobei Sie als Ziel die bereits vorhandene

Methode verwenden. Achten Sie darauf, dass die gesamte Methode blau unterlegt wird –

dann hat Xcode erkannt, dass Sie nicht eine Action in der Methode einfügen möchten (das

funktioniert nicht), sondern dass Sie das Steuerelement mit der vorhandenen Methode ver-

bindenmöchten.

Naturgemäß müssen Sie die Methode nun ein wenig modifizieren: Erst mit einer Auswer-

tung des sender-Parameters können Sie erkennen, welches Steuerelement den Aufruf der

Methode ausgelöst hat. Wenn Sie beispielsweisemehrere Buttonsmit einerMethode verbun-

den haben, können Sie wie folgt den Text des Buttons ausgeben:

@IBAction func btnAction (_ sender : UIButton ) {print(sender .currentTitle !)

}

385

Page 23: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 386 — #382

15 Hello iOS-World!

Ein Outlet für mehrere Steuerelemente (Outlet Collections)

Auch der umgekehrte Fall ist möglich – Sie können mehrere Steuerelemente über ein Outlet

ansprechen. Genau genommen handelt es sich dann nicht mehr um ein einfaches Outlet,

sondernumeineOutlet Collection. Dazumarkieren Sie das erste Steuerelement, ziehen esmit

(ctrl)-Drag in den Controller-Code und wählen Connection = Outlet Collection (siehe

Abbildung 15.7). Xcode erzeugt anstelle einer einfachen Outlet-Variablen nun ein Array:

@IBOutlet var allButtons : [UIButton ]!

In der Folge verbinden Sie auch die weiteren Steuerelemente durch (ctrl)-Drag mit die-

sem Array. Xcode ist leider nicht in der Lage, mehrere markierte Steuerelemente auf einmal

zu verbinden. Im Code können Sie nun unkompliziert Schleifen über alle so verbundenen

Steuerelemente bilden.

Abbildung 15.7 Dialog zum Einrichten einer Outlet-Collection

Actions oder Outlets umbenennen

Wenn Sie im Code Actions oder Outlets einfach einen neuen Namen geben, funktioniert Ihre

App nichtmehr. Xcodemerkt sich die Verknüpfung zu IhrenMethoden bzw. Eigenschaften in

Form von Zeichenketten. Nach der Umbenennung ist dann keine korrekte Zuordnung mehr

möglich.

Deswegen müssen Sie zum Umbenennen das neu in Xcode 9 verfügbare Kommando Refac-

tor • Rename verwenden. Sie können dieses Kommando entweder nach einem Kontext-

menüklick auf den Variablennamen oder über das Editor-Menü ausführen. Xcode zeigt nun

automatisch alle Stellen im Code und im Storyboard an, wo die Umbenennung wirksamwird

(siehe Abbildung 15.8).

Zuordnung zwischen Steuerelementen und Actions/Outlets ergründen

Eigenschaften und Methoden, die mit Steuerelementen verbunden sind, werden im Code-

Editor durch einen runden Punkt gekennzeichnet. Der Editor verrät aber leider nicht, zu

welchem Steuerelement die Verbindung besteht.

386

“buch” — 2017/10/6 — 8:49 — page 387 — #383

15

15.4 Actions und Outlets für Fortgeschrittene

Abbildung 15.8 Umbenennung einer Outlet-Variablen

Wesentlich hilfreicher ist Xcode in die umgekehrte Richtung: Wenn Sie im Storyboard-Editor

das betreffende Steuerelement mit der rechten Maus- oder Trackpad-Taste anklicken, zeigt

ein Kontextmenü alle Zuordnungen zu Actions oder Outlets (siehe Abbildung 15.9). Dort kön-

nen Sie die Action- oder Outlet-Verknüpfung löschen, die Sie nicht mehr brauchen.

Abbildung 15.9 Die rechteMaus- oder Trackpad-Taste führt in eine Liste aller Actions und Outlets

eines Steuerelements.

387

Page 24: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 388 — #384

15 Hello iOS-World!

Fehlermeldung »unrecognized selector«

Wenn Ihre App mit der nicht besonders aussagekräftigen Fehlermeldung unrecognized selec-

tor abstürzt, liegt dies in der Regel daran, dass die Zuordnung zwischen einem Steuerelement

und demOutlet oder der Action verloren gegangen ist – z. B. weil Sie einen Action-Methoden-

namen direkt geändert haben, anstatt Refactor • Rename auszuführen.

Abhilfe: Löschen Sie im Kontextmenü die Verbindung (siehe Abbildung 15.9), und richten Sie

diese dannmit einem (ctrl)-Drag neu ein.

Steuerelemente kopieren

Wenn Sie Steuerelemente mit (Š)+(C) und (Š)+(V) kopieren, werden dabei alle möglichen un-

sichtbaren Attribute und Eigenschaftenmitkopiert, unter anderem zugeordnete Actions. Oft

erspart Ihnen das eine wiederholte Einstellung dieser Merkmale, aber mitunter führt dieses

Verhalten zu unerwartetenNebenwirkungen. EinKlick auf das Steuerelementmit der rechten

Maus- oder Trackpad-Taste offenbart alle zugeordneten Outlets und Actions.

15.5 Layout optimieren

Es ist Ihnen sicher aufgefallen, dass das Layout unserer App, also die Anordnung und Größe

der Steuerelemente, verbesserungswürdig ist. Die Größe der Steuerelemente ist willkürlich.

Wenn Sie die App in verschiedenen iOS-Geräten ausprobieren, werden Sie feststellen, dass

teilweise große Teile des Bildschirms ungenutzt bleiben, während das Textfeld bei anderen

Geräten womöglich sogar abgeschnitten und unvollständig dargestellt wird. Besonders deut-

lich werden die Layoutdefizite, wenn Sie den iOS-Simulator mit Hardware • Rotate in das

Querformat drehen.

Wie würden unsere Layoutwünsche denn aussehen?

Der Button soll ohne unnötige Abstände links oben im Bildschirm dargestellt werden.

Das Textfeld soll darunter platziert sein.

Es soll die gesamte verbleibende Größe des Bildschirms nutzen.

Es soll seine Größe bei einer Drehung des Geräts automatisch anpassen.

Momentan wird unser Programm diesen Wünschen deswegen nicht gerecht, weil wir die

Position und Größe der Steuerelemente absolut festgelegt haben. Wir haben die Steuer-

elemente im View weitgehend nach Gutdünken platziert.

Layoutregeln

Die Lösung, die Xcode bzw. eigentlich das UIKit (also das Framework zur iOS-Programmie-

rung) hierfür anbietet, heißt Layoutregeln (Constraints). Sie können also für jedes Steuer-

388

“buch” — 2017/10/6 — 8:49 — page 389 — #385

15

15.5 Layout optimieren

element Regeln aufstellen, die das Steuerelement einhalten soll. Das UIKit bemüht sich dann,

in Abhängigkeit von der gerade vorliegenden Form und Größe des iOS-Geräts, allen Regeln

gerecht zu werden. Beispiele für derartige Regeln sind:

Der horizontale Abstand zwischen dem Steuerelement A und seinem nächstgelegenen

linken oder rechten Nachbarn soll 8 Punkte betragen. Bei Retina-Geräten mit doppelter

Auflösung entspricht das 16 Pixeln.

Der vertikale obere Abstand zwischen dem Steuerelement A und dem Bildschirmrand soll

16 Punkt betragen.

Steuerelement A soll genauso breit sein wie Steuerelement B.

Steuerelement A soll innerhalb seines Containers vertikal und/oder horizontal zentriert

werden.

Die linken Ränder der Steuerelemente A, B und C sollen in einer Linie verlaufen.

Wenn wir also erreichen möchten, dass die Steuerelemente der Hello-World-App wie oben

formuliert angeordnet werden, müssen wir nur die entsprechenden Regeln formulieren. Mit

etwas Erfahrung gelingt dies rasch; gerade Einsteiger in die iOS-Programmierung scheitern

aber oft an der damit verbundenen Komplexität.

Glücklicherweise macht Xcode es sehr einfach, Layoutregeln zu testen, ohne die App jedes

Mal neu starten zu müssen: Dazu verändern Sie einfach in der Fußleiste von Xcode das iOS-

Device und seine Orientierung. Xcode passt dann die View an die neue Gerätegröße an, und

Sie erkennen sofort, ob die Steuerelemente wunschgemäß platziert werden.

Layoutregeln für den »Hello-World«-Button

Eine detaillierte Erklärung der Layoutregeln erhalten Sie in Abschnitt 16.5, »Auto Layout«.

An dieser Stelle möchte ich Ihnen nur rezeptartig erklären, wie Sie das Layout der Hello-

World-App korrekt einstellen. Um die Layoutregeln einzustellen, verwenden Sie fünf Buttons,

die sich rechts unten im Editor befinden (siehe Abbildung 15.10). Die ersten beiden Buttons

(Update Frames und Embed in Stack) lösen unmittelbar Aktionen aus. Die anderen drei

führen in kleine Dialoge bzw. Menüs, in denen Sie Einstellungen vornehmen können.

Abbildung 15.10 Die winzigen Layout-Buttons befinden sich rechts unten im Storyboard-Editor.

389

Page 25: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 390 — #386

15 Hello iOS-World!

Beginnen Sie mit dem Button Hello World!: Nachdem Sie den Button beschriftet haben,

platzieren Sie ihn links oben im View Controller, wobei Sie Abstände zu den Rändern einhal-

ten. Dabei helfen Orientierungslinien, an denen der Button beim Verschieben einrastet. Den

rechten Rand des Buttons ziehen Sie bis knapp an den rechten Rand des View Controllers.

Auch dort rastet der Button ein. Damit nutzt der Button die gesamte Breite, hält dabei aber

einen kleinen optischen Abstand ein und lässt die obere Zeile des iPhones oder iPads frei.

Damit der Text dennoch links ausgerichtet wird, stellen Sie die Textausrichtung im Attribut-

inspektor auf Alignment = Left.

Während der Button noch immer ausgewählt ist, klicken Sie nun auf den Layout-Button

Add New Constraints. Damit erscheint der gleichnamige Dialog zur Einstellung diver-

ser Abstände (siehe Abbildung 15.11). Dort klicken Sie zuerst die Verbindungsstege für die

Abstände nach oben, nach links und nach rechts an, sodass diese Stege durchgängig rot ange-

zeigtwerden. Alle drei Abstandswerte sollten jeweils denWert0 enthalten. Standardmäßig ist

die Option Constrain tomargins aktiv. Sie bewirkt, dass diese Abstände relativ zu den vom

jeweiligen iOS-Gerät vorgegebenen Rahmen (Guide Lines) gerechnet werden. Zuletzt schlie-

ßen Sie den Dialogmit dem Button Add 3 Constraints. Damit werden drei neue Regeln zur

Positionierung des Buttons festgelegt.

Abbildung 15.11 Layoutregeln für den Hello-World-Button festlegen

Die neuen Layoutregeln ändern nichts an der aktuellen Position des Buttons. Sie können

nun aber versuchen, in der Leiste View as iPhone xxx ein anderes Gerät auszuwählen.

Aufgrund der Layoutregeln wird sich der Button automatisch an die geänderten Platzverhält-

nisse anpassen.

390

“buch” — 2017/10/6 — 8:49 — page 391 — #387

15

15.5 Layout optimieren

Interessant ist das Verhalten, wenn Sie den Button aus seiner durch die Regeln festgeleg-

ten Position hinausziehen. Nun zeigen orange strichlierte Linien an, wo der Button bei der

Programmausführung platziert wird (siehe Abbildung 15.12). Außerdem visualisieren zwei

orange Stege die von Ihnen aufgestellten Regeln. Aus den Zahlenwerten geht hervor, um

wie viele Punkte das Element aktuell falsch positioniert ist. Um den Button den Regeln ent-

sprechend wieder korrekt zu positionieren, klicken Sie auf den ersten Layout-Button Update

Frames.

Abbildung 15.12 Wenn die Position eines Steuerelements aktuell nicht den Layoutregeln entspricht,

zeigt der Storyboard-Editor an, wo das Element zur Laufzeit platziert wird.

Layoutregeln für das Textfeld

Nun ist das Textfeld an der Reihe. Der erste Schritt besteht wieder darin, dass Sie das Steuer-

element in der Ansicht so platzieren, wie es auch zur Laufzeit angeordnet werden soll. In

diesem Fall bietet es sich an, das Steuerelement bündig unterhalb des Buttons anzuord-

nen und dann die Größe so einzustellen, dass es – wieder unter Einhaltung eines kleinen

Abstands – den ganzen View-Controller ausfüllt. Das fällt nicht schwer, weil die Begrenzungs-

linien des Steuerelements automatisch an den richtigen Stellen einrasten.

Nun klicken Sie neuerlich auf den Button Add New Constraints. Dort stellen Sie die folgen-

den Abstände ein (siehe Abbildung 15.13):

Links: 0 Punkte. Dieser Abstand gilt wegen derOptionConstrain tomargins relativ zum

Standardrahmen.

Oben: 8 Punkte. Dieser Abstand wird relativ zum nächstgelegenen Steuerelement gerech-

net, in diesem Fall also zum Button.

Rechts: 0 Punkte. Dieser Abstand gilt wieder relativ zum Standardrahmen.

Unten: 8 Punkte. Auch dieser Abstand gilt relativ zum Standardrahmen. Dieser sieht nach

unten aber keinen Rand vor. Damit das Textfeld von allen Rändern gleich weit entfernt ist,

muss hier ein etwas größerer Wert angegeben werden.

Add 4 Constraints beendet die Eingabe und fügt vier Regeln hinzu. Damit sollten beide

Steuerelemente korrekt angeordnet sein. Ändern Sie nun in der Fußleiste des Storyboard-

Editors das iOS-Device und die Ausrichtung. Der Ort und die Größe der Steuerelemente sind

nun immer korrekt an die jeweilige Bildschirmgröße angepasst (siehe Abbildung 15.14).

391

Page 26: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 392 — #388

15 Hello iOS-World!

Abbildung 15.13 Layoutregeln für das Textfeld

Embed-in-Stack-Aktion rückgängig machen

Die Buttons Align, AddNewConstraints und Resolve Auto Layout Issues führen jeweils

in Dialoge oder Menüs, in denen Sie die jeweilige Aktion auswählen bzw. bestätigen. Es

besteht also keine Gefahr, dass Sie irrtümlich eine Aktion durchführen, die Sie nicht wollen.

Ganz anders verhält sich der zweite Layout-Button Embed in Stack: Sofern im Storyboard-

Editor gerade ein Steuerelement markiert ist bzw. mehrere Steuerelemente markiert sind,

werden diese in eine Stack-View verpackt, also in einen Container, der bei der Anordnung der

Steuerelemente helfen soll. Diese Aktion erfolgt sofort, ohne Rückfrage und ohne visuelles

Feedback, also oft ungewollt und unbemerkt.

Ungewollte Stack-View-Verschachtelungen erkennen Sie, wenn Sie im Storyboard-Editor die

Seitenleiste Document Outline aktivieren. Sie zeigt die hierarchische Struktur aller Steuer-

elemente im Storyboard-Editor. Dort können Sie bei Bedarf die betroffenen Steuerelemente

aus der Stack-View herausziehen (siehe Abbildung 15.15). Danach können Sie die Stack-Views

in der Seitenleiste anklicken und löschen.

392

“buch” — 2017/10/6 — 8:49 — page 393 — #389

15

15.5 Layout optimieren

Abbildung 15.14 Die Hello-World-App im iPhone-8-Querformat

Abbildung 15.15 Ungewollte Stack-View-Verschachtelungen auflösen

393

Page 27: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 394 — #390

15 Hello iOS-World!

Stack-Views richtig einsetzen

Stack-Views sind ein durchaus nützliches Feature, das dabei hilft, allzu komplizierte Layout-

regeln zu vermeiden. Den richtigen Umgang mit Stack-Views erläutere ich Ihnen in

Abschnitt 16.7.

Die Document-Outline-Seitenleiste verstehen

Die Document-Outline zeigt, wie die Steuerelemente (Views) innerhalb eines View-Control-

lers ineinander verschachtelt sind (siehe Abbildung 15.15), und sie hilft dabei, das gewünschte

Element auszuwählen, wenn zwei Elemente übereinander platziert sind. Innerhalb des

Objektbaums erhält jedes Element standardmäßig einenNamen, der seiner Klasse entspricht

– z. B. View für ein UIView-Objekt. Bei einigen Steuerelementtypen, z. B. bei Buttons und Labels,

wird der dort eingetragene Text angezeigt – also Noch ein Button statt einfach Button.

Sie können imObjektbaumalleObjekte durch einfaches Anklickenumbenennen. Das ist dann

sinnvoll, wenn es mehrere gleichartige Objekte gibt, die Sie im Storyboard-Editor leichter

identifizieren wollen. Beachten Sie aber, dass die Objektnamen in der Document-Outline-

Seitenleiste ausschließlich für den Storyboard-Editor von Xcode gelten!

Im Code Ihrer View-Controller-Klasse haben Sie keine Möglichkeit, den Namen festzustellen,

den Sie einem Objekt in der Outline-Seitenleiste gegeben haben. Sie können zur Identifizie-

rung von Steuerelementen im Code auf die tag-Eigenschaft zurückgreifen. In dieser auch in

Xcode zugänglichen Eigenschaft können Sie allerdings nur eine ganze Zahl speichern. Eine

zweite Möglichkeit besteht darin, eine eigene Klasse mit einer neuen Eigenschaft zu definie-

ren. Ein Beispiel dafür finden Sie in Abschnitt 20.3, »Focus Engine«.

Wenn es Probleme gibt

Der Umgang mit Layoutregeln ist schwierig und führt häufig dazu, dass sich Xcode über feh-

lende oder über zueinander im Konflikt stehende Regeln beklagt. In Abschnitt 16.5, »Auto

Layout«, folgt eine Menge weiterer Details zu diesem Thema. Bis dahin vertröste ich Sie hier

mit einigen Tipps:

Sobald Sie eine Regel für ein Steuerelement festlegen, müssen Sie die Größe und Position

des Steuerelements vollständig durch Regeln bestimmen. Mit anderenWorten: Solange es

gar keine Regeln gibt, betrachtet Xcode das Steuerelement als unbestimmt und meckert

nicht. Sobald Sie aber beginnen, Regeln festzulegen, müssen Sie dies so tun, dass keine

Unklarheiten verbleiben.

Die Anzahl der erforderlichen Regeln ist nicht bei jedem Steuerelement gleich. Manche

Steuerelemente können ihre optimale Größe aus dem Inhalt selbst ermitteln. Das trifft

z. B. bei einem Button zu. Hier reichen also Regeln, die die Position festlegen. Bei anderen

394

“buch” — 2017/10/6 — 8:49 — page 395 — #391

15

15.6 Textgröße mit einem Slider einstellen

Steuerelementen müssen Sie die Größe selbst einstellen – und das erfordert zwei weitere

Regeln.

Sie können vorhandene Regeln nicht ohne Weiteres ändern. Die Dialoge Add New Align-

ment Constraints bzw. Add New Constraints ersetzen bzw. verändern nicht vorhan-

dene Regeln, sondern definieren zusätzliche Regeln. Das führt oft zu Regeln, die sich

widersprechen. EinenÜberblick über alle Regeln erhalten Sie, wenn Sie die Seitenleiste des

Storyboard-Editors einblenden (Editor • ShowDocumentOutline). Dort finden Sie eine

Liste aller Constraints. Wenn Sie eine der Regeln anklicken, wird die betreffende Regel

markiert.

Bei kleinen Projekten ist es bei Problemen oft am einfachsten, alle Regeln zu löschen und

noch einmal von vorne zu beginnen. Dazu klicken Sie auf den Button Resolve Auto Lay-

out Issues und führen All Views in View Controller • Clear Constraints aus.

In Xcode 9 hat es einige Änderungen bei den Layoutregeln gegeben. Beispielsweise zeigt

Xcoden nun eine Warnung an, wenn Sie die Breite von Steuerelementen mit Text fixieren

oder wenn Sie bei einem Button oder Label nur den linken Rand, nicht aber den rechten

einstellen.

In beiden Punkten war Xcode 8 toleranter. Xcode 9 zwingt hier zu neuen Arbeitstechni-

ken, z. B. zur vermehrten Verwendung der Stack-View oder zur beidseitigen Fixierung der

horizontalen Ränder. Anfänglich ist das lästig, längerfristig sollten die geänderten Vor-

gehensweisen aber robuster sein und vermeiden, dass die Änderung der Beschriftung

womöglich zu abgeschnittenen Texten führt.

15.6 Textgrößemit einem Slider einstellen

Als letzte Erweiterung für das Programm fügen wir diesem nun neben dem Button noch

einen Slider hinzu, mit dem die Schriftgröße des Textfelds verändert werden kann (siehe

Abbildung 15.16).

Das Slider-Steuerelement hinzufügen

Sie finden das Steuerelement in der Xcode-Objektbibliothek unter dem Namen Slider. Fügen

Sie es in den View-Controller ein, und platzieren Sie es so, dass es am rechten und oberen

Rand einrastet, wobei Sie dieselben Abstände wie bei den anderen Steuerelementen einhal-

ten. Mit Add Align Constraints fixieren Sie die Abstände nach oben und nach rechts (die

Werte sollten jeweils 0 lauten) sowie die Breite des Steuerelements (114 in Abbildung 15.17,

aber Sie können natürlich auch eine andere Breite wählen). Die Werte für die Abstände nach

rechts und nach unten (174 bzw. 11 in Abbildung 15.17) spielen keine Rolle, weil die entspre-

chenden Regeln nicht aktiviert werden.

395

Page 28: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 396 — #392

15 Hello iOS-World!

Abbildung 15.16 Die erweiterte Hello-World-App mit einem Slider zur Einstellung der Textgröße,

diesmal im Simulator im Querformat ausgeführt

Abbildung 15.17 Layoutregeln für den Slider einstellen

Mit dem Slider soll die Textgröße in einem Bereich zwischen 12 und 30 Punkt verändert

werden. Dazuwählen Sie den Slider aus und stellen imAttributinspektor die folgenden Eigen-

schaften ein:

396

“buch” — 2017/10/6 — 8:49 — page 397 — #393

15

15.6 Textgröße mit einem Slider einstellen

Minimum: 12

Maximum: 30

Current: 16

Den Slider mit einer Methode verbinden

Damit sind die Arbeiten an der Oberfläche abgeschlossen, und wir können uns wieder der

Programmierung zuwenden: Öffnen Sie den Assistenz-Editor, und verschieben Sie den Slider

mit (ctrl) in den Code-Bereich. Die Verbindungsparameter stellen Sie wie folgt ein:

Connection = Action: Wir wollen in einer Methode auf das Verschieben des Sliders rea-

gieren.

Name: Die Methode muss einen Namen bekommen. Ich habe mich für sliderMove ent-

schieden.

Type = UISlider: In der Methode müssen wir die aktuelle Position des Sliders herausfin-

den. Deswegen soll die Instanz des Sliders an die Methode übergeben werden.

Event = Value Changed: Die Defaulteinstellung passt hier gut – andere Ereignisse inter-

essieren uns nicht.

Arguments = Sender: Damit wird die Instanz des Sliders als Parameter an die Methode

übergeben. Den Datentyp des Parameters haben wir ja bereits mit UISlider festgelegt.

Zu Testzwecken bauenwir in dieMethode vorerst nur die print-Funktion ein, um eine Verän-

derung des Sliders in Xcode verfolgen zu können. Uns interessiert die value-Eigenschaft, die

die Slider-Position im eingestellten Wertebereich als Fließkommazahl liefert:

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

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

}

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

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

withSize eine neue Instanz in der gewünschten Größe und weisen diese der font-Eigenschaft

des Textfelds wieder zu. Da fontWithSize einen CGFloat-Parameter erwartet, muss die Fließ-

kommazahl von sender.value in den CGFloat-Typ umgewandelt werden. CGFloat ist auf

32-Bit-Architekturen ein Float, auf 64-Bit-Architekturen aber ein Double.

// Schriftgr öße im Textfeld einstellen@IBAction func sliderMove (_ sender : UISlider ) {

textView .font = textView .font?.withSize (CGFloat (sender .value))}

397

Page 29: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 398 — #394

15 Hello iOS-World!

15.7 Apps auf dem eigenen iPhone/iPadausführen

Den iOS-Simulator in Ehren, aber natürlich wollen Sie Ihre Programme auch auf »richti-

ger« Hardware testen. Während dazu früher ein kostenpflichtiger Apple-Developer-Account

erforderlich war, ist das Ausführen eigener Apps auf eigenen Geräten mittlerweile kostenlos

möglich (Free Provisioning). Dazu verbinden Sie im Dialog Preferences •Accounts Xcode

mit Ihrer Apple-ID. Außerdem muss Ihr iOS-Gerät durch ein USB-Kabel mit dem Computer

verbunden sein. Nach diesen Vorbereitungsarbeiten können Sie das iOS-Gerät in der Symbol-

leiste von Xcode anstelle eines Simulators auswählen.

Wenn Sie (Š)+(R) drücken bzw. den Run-Button anklicken, überträgt Xcode die Hello-World-

App auf das angeschlossene iPhone oder iPad und startet sie dort. Das gelingt nur, wenn Ihr

Smartphone oder Tablet entsperrt ist. Bemerkenswert ist, dass trotz der externen Programm-

ausführung die Debugging-Funktionen von Xcode aktiv bleiben. Wenn Sie also z. B. einen

Breakpoint setzen, wird die App an dieser Stelle angehalten. Sie können inXcodeden Zustand

der Variablen ergründen und das Programmdann wieder fortsetzen.

Die App bleibt jetzt auf dem iPhone oder iPad. Sie kann dort losgelöst von Xcode ausgeführt

werden – dann aber ohne Debugging-Möglichkeiten. Sie können Ihre App wie jede andere

installierte App problemlos wieder löschen, indem Sie sie zuerst länger anklicken und dann

auf das x-Symbol drücken.

Einschränkungen des Free Provisioning

Apple bezeichnet das Verfahren zum Ausführen von Apps auf iOS-Geräten ohne Apple-

Developer-Account als Free Provisioning. Dabei gibt es aber Einschränkungen: Der Test

von einigen Zusatzfunktionen erfordert weiterhin einen kostenpflichtigen Apple-Developer-

Account. Das gilt z. B. für In-App-Käufe, den Datenaustauschmit der iCloud oder die Verwen-

dung der Apple-Pay-Funktionen.

App-Ausführung ohne Kabel

Eine praktische Neuerung von Xcode 9 besteht darin, dass Testgeräte nicht mehr ständig

über ein USB-Kabel mit Ihrem Computer verbunden bleiben müssen. Um diesen Kom-

munikationsmechanismus zu konfigurieren, muss das Gerät aber weiterhin einmalig per

Kabel verbunden werden. Anschließend führen Sie in Xcode Window•Devices and Simu-

lators aus, wählen Ihr Gerät und aktivieren die Option Connect via Network (siehe

Abbildung 15.18).

398

“buch” — 2017/10/6 — 8:49 — page 399 — #395

15

15.7 Apps auf dem eigenen iPhone/iPad ausführen

Abbildung 15.18 Xcode 9 erlaubt (endlich) die App-Entwicklung ohne Kabel.

Apple Developer Program

Bevor Sie eine App in den App Store hochladen können, müssen Sie Ihre App speziell

vorbereiten und signieren (siehe Kapitel 31, »App Store und Co.«). Das ist nurmit dem Schlüs-

selsystemdes Apple Developer Programmöglich. DieMitgliedschaft hat auch andere Vorteile

– etwa den unkomplizierten Zugang zu Beta-Versionen von iOS, macOS und Xcode, den

Zugang zu Entwicklerforen etc.:

https://developer.apple.com/programs

Dieses Service-Paket lässt sich Apple mit zurzeit 100 EUR pro Jahr bezahlen. Im Gegensatz zu

früher, als es verschiedene Entwicklerprogramme für iOS, macOS und Safari gab, hat Apple

diese Programme nun zu einem einzigen verbunden.

Eine vorhandene oder eine neue Apple-ID verwenden?

Bevor Sie sich dem Entwicklerprogramm anschließen, müssen Sie sich überlegen, welche

Apple-ID Sie hierfür verwenden. Normalerweise spricht nichts gegen Ihre gewöhnliche Apple-

ID. Sollten Sie diese ID aber schon imRahmen von iTunes Connect zumVerkauf vonMusik oder

Büchern nutzen, dann benötigen Sie eine zweite Apple-ID für das Entwicklerprogramm.

Sie können dem Entwicklerprogramm wahlweise als Einzelperson oder als Team beitreten.

Als Einzelperson benötigen Sie dazu lediglich eine Kreditkarte. Nach Abschluss des Bezahl-

prozesses kann es ein paarMinuten dauern, bis Ihr Entwicklerzugang freigeschaltet wird und

Sie die entsprechendeWelcome-E-Mail erhalten.

399

Page 30: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 400 — #396

15 Hello iOS-World!

Nun können Sie in denXcode-Einstellungen imDialogblattAccountsmitAddApple ID Ihre

Apple-ID mit Xcode verbinden. Von dort gelangen Sie mit View Details in einen weiteren

Dialog, in dem Sie Schlüssel generieren können (siehe Abbildung 15.19). Vorerst benötigen

Sie lediglich einen Schlüssel zur iOS-Entwicklung (also den Eintrag iOS Development).

Abbildung 15.19 Verwaltung der Schlüssel des iOS-Entwicklerprogramms in Xcode

Nach diesen Vorbereitungsarbeiten wird jedes Gerät, auf dem Sie via Xcode eigene Apps

ausführen, in das Entwicklungsprogramm aufgenommen. Insgesamt dürfen Sie pro Jahr

maximal 500 Geräte mit Ihrem Konto verbinden: 100 iPhones, 100 iPods, 100 iPads sowie

je 100 Apple-TV- und Apple-Watch-Geräte. Einen Überblick über alle mit Ihrem Konto ver-

bundenen iOS-Geräte finden Sie auf der Webseite des Entwicklerprogramms:

https://developer.apple.com/account/ios/device

15.8 Komponentenund Dateien eines Xcode-Projekts

Wenn Sie in Xcode ein neues iOS-Projekt starten, besteht dieses standardmäßig schon aus

einerMengeDateien (sieheAbbildung 15.20) – und dabei bleibt es nicht. Dieser Abschnitt gibt

Ihnen einen kurzen Überblick darüber, welche Datei welchen Zweck hat. Detaillierte Erläute-

rungen zu vielen Dateien folgen dann in den weiteren Kapiteln.

AppDelegate.swift enthält Code zur Verarbeitung von Ereignissen des App-Lebenszyklus

(siehe Abschnitt 16.4, »Phasen einer iOS-App«).

400

“buch” — 2017/10/6 — 8:49 — page 401 — #397

15

15.8 Komponenten und Dateien eines Xcode-Projekts

LaunchScreen.storyboard enthält eine spezielle Ansicht der App, die während des Starts

als eine Art Willkommensdialog angezeigt wird (siehe Abschnitt 31.1, »iOS-Artwork (Icons,

Launch Screen)«).

Assets.xcassets dient als Container für die Bilddateien der App. Dazu zählen neben dem

Icon der App auch alle anderen Bitmaps, die Sie irgendwann anzeigen möchten. Die Be-

sonderheit von Xcassets-Dateien besteht darin, dass Bitmaps in mehreren Auflösungen

gespeichert werden können. Bei der Ausführung verwendet iOS dann automatisch die

Datei, die am besten zum Display des iOS-Geräts passt (siehe Abschnitt 16.10, »Image-

Views und Xcassets«, und Abschnitt 31.1, »iOS-Artwork (Icons, Launch Screen)«).

Info.plist enthält diverse Projekteinstellungen in Form einer sogenannten Property List

(Key-Value-Datei).

Main.storyboard beschreibt das Aussehen und die Eigenschaften der Ansichten (View-

Controller) einer App.

ViewController.swift enthält den Controller-Code der ersten Ansicht des Storyboards.

Für jede weitere Ansicht im Storyboard müssen Sie in der Regel eine weitere Swift-Datei

hinzufügen, die eine von UIViewController abgeleitete Klasse definiert (siehe Kapitel 17,

»iOS-Apps mit mehreren Ansichten«).

Abbildung 15.20 Überblick über die Code-Dateien im Projektnavigator von Xcode

Dateien im Navigator verschieben

Sie können die Dateien des Projekts im Navigator verschieben und in Gruppen bzw. Ver-

zeichnisse gliedern. Es spielt für Xcode keine Rolle, in welchem Verzeichnis die Dateien sich

befinden. Xcode findet in jedem Fall alle zum Kompilieren erforderlichen Dateien. Die Organi-

sation ist lediglich ein Hilfsmittel für Sie, um einen besseren Überblick zu wahren.

Eine Neuerung in Xcode 9 besteht darin, dass die im Navigator angezeigten Gruppen

tatsächlich in Form von Verzeichnissen im Dateisystem abgebildet werden. In älteren Xcode-

Versionenwar die Gruppenzuordnung virtuell, was mitunter Verwirrung stiftete.

401

Page 31: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 402 — #398

15 Hello iOS-World!

Weitere Dateien

Bei »richtigen« Apps, die also nicht nur Test- oder Beispielcharakter haben, kommen zu den

anfänglich vorhandenen Dateien zumeist viele weitere Dateien hinzu:

Weitere Swift-Code-Dateien verbinden Objekte Ihrer Oberfläche mit eigenen Klassen bzw.

bilden die innere Logik Ihres Programms ab, also das Datenmodell gemäß des MVC-

Musters (siehe Abschnitt 16.1, »Model-View-Controller (MVC)«).

Zusätzliche Lokalisierungsdateien enthalten Zeichenketten für alle Sprachen, in denen die

App später ausgeführt werden kann (siehe Abschnitt 31.4, »Mehrsprachige Apps«).

Ja nach Zielsetzung der App sind außerdem Text-, XML-, HTML-, Datenbank- sowie Audio-

und Video-Dateien erforderlich. Diese Dateien werden zusammen mit der App ausgelie-

fert (Bundle-Dateien).

Test- und Produktgruppe

Neben der eigentlichen Projektgruppe, deren Namemit dem Projektnamen übereinstimmt,

kann ein Projekt bis zu drei weitere Gruppen aufweisen:

projektnameTests und projektnameUITests enthält Code und Einstellungen zum automati-

sierten Test Ihres Projekts. Das zugrunde liegende XCTest-Framework hat eine ähnliche

Zielsetzung wie Unit Tests in anderen Programmiersprachen. In diesem Buch gehe ich

darauf allerdings nicht ein.

Products enthält das kompilierte Programm. Bei der iOS-App-Entwicklung werden die hier

enthaltenenDateien aber selten benötigt, weil die Ausführung vonApps durchXcodeauto-

matisiert ist und eine Weitergabe von Apps an andere Benutzer nur über den App Store

möglich ist.

402

Page 32: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1193 — #1189

40

Kapitel 40

Breakout

Breakout ist ein klassisches Spielhallenspiel. Es geht darum,mit einemBall rechteckige Steine

(Bricks) abzuschießen. Es ist Aufgabe des Spielers, denBallmit einemSchläger (Paddle) in dem

nach unten offenen Spielfeld zu halten. Die erste Version des Spiels wurde 1976 von Atari

produziert, wobei die Spiellogik nicht durch ein Programm, sondern in Hardware realisiert

wurde.

Abbildung 40.1 Das Spiel »Breakout«

Breakout hat übrigens schon seit Langem mit Apple zu tun: Steve Jobs, der damals für Atari

arbeitete, überließ es SteveWozniak, einen Prototyp für das Spiel zu bauen, bezahlte ihn dafür

aber nur schäbig. Nichtsdestotrotz gründeten die beiden wenig später Apple.

https://de.wikipedia.org/wiki/Breakout_(Computerspiel)

1193

Page 33: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1194 — #1190

40 Breakout

Aus Entwicklersicht ist Breakout ein dankbares Beispiel für den Einstieg in die Spieleprogram-

mierung (siehe auch Kapitel 28, »SpriteKit«): Die hier präsentierte Version umfasst nur rund

250 Zeilen, wenn man den Begleit-Code wegrechnet (CGOperators.swift, GameViewControl-

ler.swift etc.).

40.1 Programmaufbau

Die App wurde aus dem Standard-Template für iOS-SpriteKit-Spiele entwickelt. Die wichtigs-

ten Dateien sind:

GameScene.sks enthält die farbige Hintergrund-Bitmap für die einzige Spielszene.

GameScene.swift enthält den Großteil des Codes.

GameViewController.swift lädt und skaliert die GameScene-Datei.

CGOperators.swift enthält Methoden und Operatoren zum eleganteren Umgang mit

CGXxx-Strukturen (siehe Abschnitt 7.3, »CGFloat, CGPoint, CGSize und Co.«).

Das Spiel kannnur imVollbildmodus auf iPhones imPortrait-Modus gespielt werden. Andere

Geräteausrichtungen wurden in den Projekteinstellungen deaktiviert.

In Abbildung 40.1 ist Ihnen vielleicht aufgefallen, dass unterhalb des Schlägers relativ viel

freier Platz ist. Beim Test des Programms hat es sich als praktisch erwiesen, diesen Platz für

die Spielsteuerung frei zu lassen. Das ermöglicht die Steuerung des Schlägers mit einem Fin-

ger, ohne dass der Finger den Schläger verdeckt.

SpriteKit-Funktionen

Mit Ausnahme der Hintergrund-Bitmap verwendet die App keine Sprites, sondern nur Sha-

pes (also SKShapeNode-Objekte). Die App nutzt die Physik-Engine: einerseits zur Berechnung

der Flugbahn des Balls, andererseits zur Erkennung von Kollisionen mit Steinen. Diese wer-

den dann aus dem Spielfeld entfernt. Es gibt keine Aktionen (SKAction-Animationen).

Erweiterungsideen

In dem Spiel gibt es nur einen Level und nur ein Leben. Wenn der Ball aus demSpielfeld fliegt,

wird das Spiel bei der nächsten Berührung des Bildschirms neu gestartet. Wenn Sie Spaß an

der App haben, können Sie diverse Erweiterungen programmieren:

Counter mit Highscore-Speicherung

Verwaltungmehrerer Leben

Gestaltung weiterer Level, wobei die Steine abwechslungsreicher angeordnet werden kön-

nen (z. B. pyramidenförmig)

1194

“buch” — 2017/10/6 — 8:49 — page 1195 — #1191

40

40.2 Initialisierung

Level mit einem zweiten Ball, der zwischen Steinen eingeschlossen ist und erst aktiv wird,

wenn er »befreit« wird

nachrückende Steine (d. h., alle 30 Sekunden kommt oben eine zusätzliche Steinreihe

hinzu; noch vorhandene Steine werden nach unten verschoben)

zunehmende Ballgeschwindigkeit im Spielverlauf

40.2 Initialisierung

Im View-Controller wird die Spielszene geladen. Die Datei GameScene.sks enthält allerdings

nur den orangen Hintergrund des Spiels. In viewDidLoad wird die Größe der Szene eingestellt.

Dabei wird die Größe des jeweiligen iOS-Geräts aus dem SKView-Objekt übernommen.

Die eigentliche Initialisierung des Spiels erfolgt durch den Aufruf von setup in der Methode

viewDidAppear. Vielleicht fragen Sie sich, warum die Initialisierung nicht wie sonst üblich

bereits in viewDidLoad erfolgt. Das hat mit den Eigenheiten des iPhone X zu tun: Beim Ein-

richten des Spiels muss der oberste Display-Bereich unbenutzt bleiben. Wie viel Platz zur

Verfügung steht, kann aber erst mit dem Aufruf von viewDidAppear durch die Auswertung

der View-Eigenschaften layoutMargins bzw. safeAreaLayoutGuide ermittelt werden.

// Projekt ios-breakout , Datei GameViewController .swiftclass GameViewController : UIViewController {

// Szene aus GameScene .sks laden (oranger Hintergrund )var scene: GameScene ! = GameScene (fileNamed : "GameScene ")!

// die Initialisierung nur einmal durchf ührenvar setupDone = false

override func viewDidLoad () {super.viewDidLoad ()

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

// Größe der Szene einstellen , Szene anzeigenlet skView = self.view as! SKViewscene.scaleMode = .aspectFillscene.size = skView .frame.sizeskView .presentScene (scene)

}

1195

Page 34: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1196 — #1192

40 Breakout

// wenn die Game -View zum ersten Mal erscheint , Initialisierung// durchf ührenoverride func viewDidAppear (_ animated : Bool) {

super .viewDidAppear (animated )if setupDone { return }scene .setup ()setupDone = true

}}

Control Center verbergen

Bei allen iOS-Gerätenmit Ausnahme des neuen iPhone X können Sie durch Hinaufstreichen

am unteren Bildschirmrand das Control Center öffnen. Ganz lässt sich das nicht verhindern

– aber wenn die Eigenschaft prefersStatusBarHidden den Zustand true zurückgibt, dann wird

ein versehentliches Öffnen des Control Centers zumindest wesentlich unwahrscheinlicher.

override var prefersStatusBarHidden : Bool {return true

}

Statusvariablen

GameScene.swift beginnt mit der Deklaration einiger Variablen, die die Eckdaten des Spiels

bzw. Spielfelds zusammenfassen:

// Projekt ios -breakout , Datei GameScene .swiftclass GameScene : SKScene {// Objekte

var paddle : SKShapeNode !var ball: SKShapeNode !var label = SKLabelNode (fontNamed : "AvenirNext -Bold")

var w: CGFloat = 0 // enthält Breite und Höhe des SKScene -var h: CGFloat = 0 // Objekts , wird in setup() eingestellt

// Spielstatusvar brickcounter = 0var status = GameStatus .waitForStart

}

Der aktuelle Spielstatus wird in status gespeichert. Diese Variable kann die Werte der folgen-

den Enumeration annehmen:

1196

“buch” — 2017/10/6 — 8:49 — page 1197 — #1193

40

40.2 Initialisierung

enum GameStatus {case waitForStart , running , won, lost

}

Für die Kollisionserkennung sind am Ende von GameScene.swift außerdem in der Struktur

PhysCategory einige UInt32-Konstanten definiert:

struct PhysCategory {static let none: UInt32 = 0static let ball: UInt32 = 1static let paddle : UInt32 = 2static let brick : UInt32 = 4static let frame : UInt32 = 8

}

Der gesamte weitere Code befindet sich innerhalb der Klasse GameScene.

Initialisierung der Spielszene

Die Initialisierung der Spielszene erfolgt in derMethode setup, die in der GameViewController-

Klasse durch viewDidAppear aufgerufen wird. Die sonst übliche Initialisierung in didMove(to:)

ist bei dieser App nicht möglich, weil zu diesem Zeitpunkt die Eigenschaften layoutMargins

bzw. safeAreaLayoutGuide noch nicht ausgewertet werden können. Diese Eigenschaften wer-

den aber gleichmehrfach benötigt, umdie Spielszene so zu gestalten, dass sie auch auf einem

iPhone X korrekt dargestellt wird:

Die Höhe des Spielbereichs (Variable h) wird im Vergleich zur Display-Größe um layout-

Margins.top reduziert, also um den Bereich des iPhone-X-Displays, der abgerundet ist. (Bei

anderen iPhone-Modellen enthält layoutMargins.top denWert 0. Das Spiel nutzt dann das

gesamte Display.)

Der Bereich, in dem sich der Ball frei bewegen kann, wird durch ein SKPhysicsBody-

Objekt eingegrenzt, das genau der Größe der sogenannten Safe Area entspricht (siehe

Abbildung 40.2).

Damit für die Spieler klar ist, wo der Ball oben reflektiert wird, wird der obere Display-

Bereich durch ein schwarzes SKShapeNode-Objekt dargestellt. In Abbildung 40.2 ist dieses

Objekt »wall« in grauer Farbe dargestellt. Bei anderen iPhone-Modellen entfällt dieses

Objekt, weil layoutMargins.top dann denWert 0 zurückgibt.

// Projekt ios-breakout , Datei GameScene .swiftfunc setup() {

w = self.frame.widthh = self.frame.height - self.view!.layoutMargins .top

1197

Page 35: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1198 — #1194

40 Breakout

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

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

// Spielobjekte zusammenstellensetupBricks (rows: 6, cols: 6)setupPaddle ()setupBall ()setupText ()

// Ball einsperrenlet gameArea = self.view!.safeAreaLayoutGuide .layoutFrameself.physicsBody = SKPhysicsBody (edgeLoopFrom : gameArea )with(self.physicsBody !) {

$0.categoryBitMask = PhysCategory .frame$0.collisionBitMask = PhysCategory .ball$0.contactTestBitMask = PhysCategory .none

}

// optische Abgrenzung nach oben (für iPhone X)let wallrect = CGRect (x: 0,

y: h,width: w,height : self.view!.layoutMargins .top)

let wall = SKShapeNode (rect: wallrect )wall.fillColor = .blackwall.strokeColor = .blackwall.zPosition = 2self.addChild (wall)

}

Um bei der Einstellung der Eigenschaften des physikalischen Körpers die wiederholte Nen-

nung von brick.physicsBody! zu vermeiden, habe ich die with-Funktion verwendet, die

schon in Abschnitt 28.7, »Kollisionserkennung«, vorgestellt wurde. Sie ist am Ende von

GameScene.swift deklariert:

func with <T>(_ object: T, closure : (T) ->()) {closure (object )

}

1198

“buch” — 2017/10/6 — 8:49 — page 1199 — #1195

40

40.2 Initialisierung

Abbildung 40.2 Breakout auf einem iPhone X

Spielsteine einrichten

setupBricks richtet rows Zeilenmit jeweils cols Steinen ein. In brickcounter wird die Gesamt-

anzahl der Steine gespeichert. Die Variable hilft später dabei, das Spielende zu erkennen. Die

Steine werden je nach Zeile in unterschiedlichen Rottönen eingefärbt. Außerdem wird jeder

Stein durch name = "brick" benannt. Das ermöglicht es später, alle Steine unkompliziert aus

der Spielszene zu löschen.

isDynamic = false schließt aus, dass sich die Steine bewegen. Dieweiteren physicsBody-Eigen-

schaften bewirken, dass der Ball von den Steinen abprallt und dass die contactDelegate-

Methode didBegin bei jeder Kollision aufgerufen wird.

func setupBricks (rows: Int, cols: Int) {let brickw = w / CGFloat (cols+1)let brickh = brickw / 3brickcounter = rows * cols

1199

Page 36: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1200 — #1196

40 Breakout

for row in 1...rows {let brickColor =

SKColor .init(red: 0.7 + 0.3 * CGFloat (rows -row) / CGFloat (rows),green: 0.2 ,blue: 0,alpha: 1)

for col in 1...cols {let brick = SKShapeNode (rectOf :

CGSize (width: brickw * 0.95 , height : brickh * 0.7))brick.fillColor = brickColorbrick.strokeColor = brickColorlet x = brickw * CGFloat (col)let y = h - brickh * CGFloat (row+1)brick.position = CGPoint (x: x, y: y)brick.zPosition = 10brick.name = "brick"self.addChild (brick)

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

$0.isDynamic = false$0.categoryBitMask = PhysCategory .brick$0.contactTestBitMask = PhysCategory .ball$0.collisionBitMask = PhysCategory .ball

}} // Ende for col

} // Ende for row} // Ende func

Geschwindigkeitsüberlegungen

Die Anzahl der Spielsteine hat bei diesem Spiel einen großen Einfluss auf den Rechenauf-

wand. Bei jedem Framemuss SpriteKit für jeden Spielstein überprüfen, ob diesermit demBall

kollidiert. Das verursacht trotz der einfachen Objektformen einen verblüffend hohen CPU-

Aufwand.

Ich habe das Spiel auf einem iPhone 5S mit 16� 16 Steinen getestet. Dabei sank die Frame-

Rate auf ca. 20. Sie wurde auch nicht höher, als ich den Ball ins Aus laufen ließ, sich also

sämtliche Objekte im Ruhezustand befanden. SpriteKit ist hier offensichtlich schlecht opti-

miert.

Wenn Sie also eine Profiversion von Breakout programmierenmöchten, sollten Sie auf die Ver-

wendung der Physik-Engine verzichten und die Kollisionsberechnungen selbst durchführen.

Das ist nicht besonders schwierig und lässt sich für die simple Spielidee sicherlich effizienter

gestalten, als dies in SpriteKit der Fall ist.

1200

“buch” — 2017/10/6 — 8:49 — page 1201 — #1197

40

40.2 Initialisierung

Schläger einrichten (Paddle)

Der Schläger ist einfach ein weiteres SKShapeNode-Objekt, das im untersten Bildschirmviertel

platziert wird. Damit der Ball vomSchläger abprallt, ist ein physikalischer Körper erforderlich.

Gleichzeitig soll der Schläger aber nicht durch die Regeln der Physik bewegt werden, sondern

ausschließlich durch den Finger auf dem Display. Daher ist isDynamic = false erforderlich.

Die BitMask-Einstellungen stellen sicher, dass der Ball vom Schläger abprallt, dass SpriteKit

aber keine weiteren (rechenaufwendigen) Kollisionsdetektoren aktiviert.

func setupPaddle () {// Paddle unten positionieren ,// Breite ist 1/5 der Bildschirmbreitepaddle = SKShapeNode (

rectOf : CGSize (width : w * 0.20 , height : w * 0.04) )paddle .fillColor = SKColor .redpaddle .strokeColor = SKColor .red

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

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

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

$0.isDynamic = false$0.categoryBitMask = PhysCategory .paddle$0.collisionBitMask = PhysCategory .ball$0.contactTestBitMask = PhysCategory .none

}}

Ball einrichten

Der Ball ist ein kreisförmiges SKShapeNode-Objekt. Er wird vertikal etwas oberhalb des Schlä-

gers positioniert. Die horizontale Position ist vom Zufall abhängig.

Den physikalischen Körper wollte ich ursprünglich rund einrichten (also mit SKPhysicsBody

(circleOfRadius ...)), das hat sich aber nicht bewährt. Es kommt dann recht oft vor, dass

der Ball auf die Ecke eines Steins trifft und in einem sehr flachen Winkel abprallt. Das mag

physikalisch korrekt sein, der Effekt ist aber unvorhersehbar und dem Spiel nicht dienlich.

Deswegen habe ich den physikalischen Körper einfach quadratisch gewählt.

Bei der Einstellung der physikalischen Eigenschaften ist es wichtig, jede Form der Reibung

oder Dämpfung zu deaktivieren – sonst wird der Ball immer langsamer. Der Ball soll von

allen anderen Körpern abprallen. Eine Kollisionsbenachrichtigung ist aber nur beim Zusam-

mentreffen mit einem Stein erforderlich.

1201

Page 37: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1202 — #1198

40 Breakout

func setupBall () {ball = SKShapeNode (circleOfRadius : w/35)ball.fillColor = SKColor .blackball.strokeColor = SKColor .blackball.position = CGPoint (x: w * 0.25 + w * 0.5 * cRnd() , y: h*0.3)ball.zPosition = 10self.addChild (ball)

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

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

PhysCategory .frame +PhysCategory .paddle

$0.contactTestBitMask = PhysCategory .brick}

}

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

Methoden in Bewegung gesetzt.

40.3 Spielsteuerung

Die touchesBegan-Methode ist für den Start des Spiels verantwortlich. Beim ersten Spiel mit

status == .waitForStart ist das Spielfeld bereits eingerichtet. Daher reicht es aus, den Ball

mit applyImpulse in Bewegung zu setzen. Wenn dagegen vorher schon eine Runde gespielt

wurde, müssen der Ball und die Spielsteine neu eingerichtet werden.

override func touchesBegan (_ touches : Set<UITouch >,with event: UIEvent ?)

{if status == .waitForStart {

// erstes Spiel: Ball in Bewegung setzenball.physicsBody !.applyImpulse (initialImpulse ())status = .runninglabel .text = ""

} else if status == .won || status == .lost {

1202

“buch” — 2017/10/6 — 8:49 — page 1203 — #1199

40

40.3 Spielsteuerung

// neues Spiel starten : zuerst aufräumen ...ball.removeFromParent ()for ch in self.children {

if let childname = ch.name , childname == "brick" {ch.removeFromParent ()

}}// ... dann das Spielfeld neu einrichtensetupBall ()setupBricks (rows:6, cols:6)ball.physicsBody !.applyImpulse (initialImpulse ())status = .runninglabel.text = ""self.isPaused = false

}}

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

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

Schläger steuern

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

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

fest. Die in GCOperators.swift definierte minMax-Funktion stellt dabei sicher, dass der Schläger

nicht über den Bildschirmrand bewegt wird.

override func touchesMoved (_ touches : Set <UITouch >,with event : UIEvent ?)

{if touches .count != 1 { return }let touch = touches .first!let xnew = touch .location (in: self).xlet xmin = paddle .frame.size.width /2let xmax = self.frame.size.width - xminpaddle .position =

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

}

touchesEnded und touchesCancelled sind gemäß den Dokumentationsvorgaben ebenfalls

implementiert, enthalten aber keinen Code. Auf den Abdruck habe ich daher verzichtet.

1203

Page 38: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1204 — #1200

40 Breakout

Test, ob der Ball im Aus ist

In der update-Methodewird getestet, ob die Y-Koordinate des Balls kleiner ist als die des Schlä-

gers. In diesem Fall ist der Ball im Aus, das Spiel ist verloren und wird pausiert.

Ein wenig merkwürdig ist der restliche Code: Während der Tests ist es immer wieder vorge-

kommen (circa einmal pro Spiel), dass der Ball von seiner üblichen diagonalen Flugbahn

abwich und sich gänzlich horizontal bzw. vertikal bewegte. Ein vernünftiges Spiel ist dann

nicht mehr möglich. Wenn das passiert, die X- oder Y-Komponente der Geschwindigkeit also

nahe 0 ist, wird die Geschwindigkeit ganz auf 0 zurückgesetzt. Anschließend erhält der Ball

wieder seinen Startimpuls. Diese Maßnahme klingt recht radikal, ist aber im Spielverlauf

optisch nicht wahrnehmbar.

override func update (_ currentTime : TimeInterval ) {if status != .running { return }

// Test , ob das Spiel verloren istif ball.position .y < paddle .frame.minPoint ().y {

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

}

// manchmal passiert es, dass der Ball sich nur noch horizontal oder// vertikal bewegt ; dann muss man der Physik ein wenig nachhelfenif abs(ball.physicsBody !.velocity .dx) <= 0.01 ||

abs(ball.physicsBody !.velocity .dy) <= 0.01{

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

}}

Kollisionserkennung

Wenn der Ball einen Stein trifft, wird die Methode didBegin des SKPhysicsContactDelegate-

Protokolls aufgerufen. In der Methode verweist dann contact.bodyA oder contact.BodyB auf

diesen Stein. Er wird einfach entfernt. (Wenn Sie möchten, können Sie hier eine nette Anima-

tion einbauen, die den Stein explodieren oder in sich zusammenfallen lässt.)

Sollte die Anzahl der Steine damit auf 0 sinken, hat der Spieler bzw. die Spielerin das Spiel

gewonnen.

1204

“buch” — 2017/10/6 — 8:49 — page 1205 — #1201

40

40.3 Spielsteuerung

extension GameScene : SKPhysicsContactDelegate {func didBegin (_ contact : SKPhysicsContact ) {

var brick:SKNode !if contact .bodyA.categoryBitMask == PhysCategory .brick {

brick = contact .bodyA.node} else if contact .bodyB.categoryBitMask == PhysCategory .brick {

brick = contact .bodyB.node} else {

return}

// Stein entfernenbrick.removeFromParent ()

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

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

}}

}

1205

Page 39: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

Auf einen Blick

Teil ISwift .................................................................................................................... 19

Teil IIApp-Programmierung ................................................................................... 371

Teil IIIProgrammier- und Arbeitstechniken ........................................................ 575

Teil IVBeispielprojekte ............................................................................................... 1041

Auf einen Blick

Page 40: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 5 — #1

Inhalt

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

TEIL I Swift

1 HelloWorld! ............................................................................................................................... 21

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

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

1.3 »Hello World« auf dem iPad .......................................................................................................... 39

2 Swift-Crashkurs ....................................................................................................................... 41

2.1 Elementare Syntaxregeln und Kommentare ............................................................................ 41

2.2 Variablen, Konstanten und Datentypen ..................................................................................... 46

2.3 Strukturierung des Codes ............................................................................................................... 50

2.4 Klassen und Datenstrukturen ....................................................................................................... 54

2.5 Fehlerabsicherung ............................................................................................................................ 56

2.6 Xcode-Crashkurs ................................................................................................................................ 58

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

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

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

3.3 Range-Operatoren ............................................................................................................................ 80

3.4 Operatoren für Fortgeschrittene .................................................................................................. 84

3.5 Eigene Operatoren ............................................................................................................................ 87

4 Variablenund Optionals ................................................................................................. 93

4.1 Variablen und Konstanten .............................................................................................................. 93

4.2 Optionals ............................................................................................................................................. 99

4.3 Wert- versus Referenztypen ........................................................................................................... 104

5

Page 41: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 6 — #2

Inhalt

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

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

5.2 Inverse Logik mit guard ................................................................................................................... 110

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

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

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

5.6 Nicht triviale Schleifen .................................................................................................................... 121

6 Funktionenund Closures ................................................................................................ 127

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

6.2 Parameter ............................................................................................................................................ 138

6.3 Standardfunktionen ......................................................................................................................... 145

6.4 Funktionale Programmierung ....................................................................................................... 149

6.5 Closures ................................................................................................................................................ 154

7 Zahlen und geometrischeStrukturen ................................................................. 165

7.1 Zahlen und boolescheWerte ......................................................................................................... 165

7.2 NSNumber ........................................................................................................................................... 170

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

8 Zeichenketten ........................................................................................................................... 179

8.1 Syntax ................................................................................................................................................... 180

8.2 Bearbeitung von Zeichenketten ................................................................................................... 184

8.3 Suchen und ersetzen ........................................................................................................................ 188

8.4 Zeichenketten zerlegen und zusammensetzen ....................................................................... 191

8.5 Zeichenketten und Zahlen umwandeln ..................................................................................... 197

8.6 Zeichenketten und binäre Daten umwandeln (Data-Struktur) .......................................... 201

9 Datum undUhrzeit .............................................................................................................. 203

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

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

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

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

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

6

“buch” — 2017/10/6 — 8:49 — page 7 — #3

Inhalt

10.3 Dictionaries ......................................................................................................................................... 226

10.4 Sets ........................................................................................................................................................ 230

10.5 Option-Sets ......................................................................................................................................... 231

10.6 Tupel ...................................................................................................................................................... 233

10.7 Lottosimulator ................................................................................................................................... 235

11 Objektorientierte Programmierung I ................................................................... 241

11.1 Klassen und Strukturen ................................................................................................................... 242

11.2 Enumerationen .................................................................................................................................. 250

11.3 Eigenschaften ..................................................................................................................................... 254

11.4 Init- und Deinit-Funktion ................................................................................................................ 266

11.5 Methoden ............................................................................................................................................ 271

11.6 Subscripts ............................................................................................................................................ 278

11.7 Typ-Aliasse ........................................................................................................................................... 281

11.8 Speicherverwaltung ......................................................................................................................... 282

12 Objektorientierte Programmierung II ................................................................. 287

12.1 Vererbung ............................................................................................................................................ 287

12.2 Generics ............................................................................................................................................... 299

12.3 Protokolle ............................................................................................................................................. 304

12.4 Standardprotokolle ........................................................................................................................... 314

12.5 Extensions ........................................................................................................................................... 322

12.6 Protokollerweiterungen .................................................................................................................. 328

12.7 Reflection und Metatypen .............................................................................................................. 331

13 Fehlerabsicherung ................................................................................................................. 337

13.1 Fehlerabsicherungmit try und catch .......................................................................................... 337

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

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

13.4 Das Error-Protokoll ............................................................................................................................ 354

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

14 Importe, Attribute und Systemfunktionen .................................................... 359

14.1 Module, Frameworks und Importe .............................................................................................. 359

14.2 Attribute .............................................................................................................................................. 363

14.3 Systemfunktionen aufrufen .......................................................................................................... 365

7

Page 42: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 8 — #4

Inhalt

TEIL II App-Programmierung

15 Hello iOS-World! ..................................................................................................................... 373

15.1 Projektstart ......................................................................................................................................... 374

15.2 Gestaltung der App .......................................................................................................................... 375

15.3 Steuerung der App durch Code ..................................................................................................... 380

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

15.5 Layout optimieren ............................................................................................................................. 388

15.6 Textgröße mit einem Slider einstellen ........................................................................................ 395

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

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

16 iOS-Grundlagen ....................................................................................................................... 403

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

16.2 Klassenhierarchie einer App-Ansicht .......................................................................................... 407

16.3 Die UIViewController-Klasse .......................................................................................................... 410

16.4 Phasen einer iOS-App ...................................................................................................................... 414

16.5 Auto Layout ......................................................................................................................................... 417

16.6 Layoutregeln durch Code definieren ........................................................................................... 433

16.7 Steuerelemente in einer Stack-View anordnen ....................................................................... 435

16.8 Layoutvarianten ................................................................................................................................. 440

16.9 Texteingaben ...................................................................................................................................... 448

16.10 Image-Views und Xcassets ............................................................................................................. 455

17 iOS-Appsmit mehreren Ansichten ......................................................................... 459

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

17.2 Ansichten durch Segues verbinden ............................................................................................. 460

17.3 Segues mit Datenübertragung ..................................................................................................... 465

17.4 Navigation-Controller ...................................................................................................................... 470

17.5 Tab-Bar-Controller ............................................................................................................................. 476

17.6 Split-View-Controller ........................................................................................................................ 482

17.7 Popups .................................................................................................................................................. 493

17.8 Ja/Nein-Dialoge (UIAlertController) ............................................................................................ 503

8

“buch” — 2017/10/6 — 8:49 — page 9 — #5

Inhalt

18 HellomacOS-World! ............................................................................................................ 507

18.1 Von iOS zu macOS ............................................................................................................................. 507

18.2 Lottozahlengenerator ...................................................................................................................... 509

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

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

19.2 Tab-View-Controller .......................................................................................................................... 526

19.3 Standarddialoge ................................................................................................................................ 533

19.4 Tastatur ................................................................................................................................................ 538

19.5 Menüs ................................................................................................................................................... 543

19.6 Programme ohneMenü .................................................................................................................. 552

20 tvOS ................................................................................................................................................... 555

20.1 Hello tvOS! .......................................................................................................................................... 556

20.2 Fernbedienung auswerten ............................................................................................................. 561

20.3 Focus Engine ....................................................................................................................................... 567

TEIL III Programmier- und Arbeitstechniken

21 Dateien undUser-Defaults ........................................................................................... 577

21.1 User-Defaults ..................................................................................................................................... 577

21.2 Dateinamen und URLs ..................................................................................................................... 582

21.3 Bundle-Dateien und Assets ............................................................................................................ 584

21.4 Standardverzeichnisse ..................................................................................................................... 586

21.5 Dateioperationen .............................................................................................................................. 590

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

22 Netzwerk, XML und JSON .............................................................................................. 601

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

22.2 XML-Dokumente auswerten ......................................................................................................... 610

22.3 JSON-Encoder und -Decoder .......................................................................................................... 614

22.4 Webseiten anzeigen ......................................................................................................................... 621

9

Page 43: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 10 — #6

Inhalt

23 Tabellenund Listen darstellen ................................................................................... 629

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

23.2 Prototypzellen .................................................................................................................................... 635

23.3 Individuelle Gestaltung von Listenzellen ................................................................................... 640

23.4 Veränderliche Listen ......................................................................................................................... 647

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

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

24 GPS- und Kompassfunktionen ................................................................................... 671

24.1 Hello MapView! ................................................................................................................................. 671

24.2 Wegstrecke aufzeichnen ................................................................................................................. 676

24.3 Kompassfunktionen ......................................................................................................................... 683

25 Grafik und Animation ........................................................................................................ 687

25.1 Eigene Steuerelementemit Grafikfunktionen ......................................................................... 687

25.2 Kompass-Steuerelement ................................................................................................................ 694

25.3 Core Graphics ..................................................................................................................................... 702

25.4 Animationen ....................................................................................................................................... 706

26 Touch,Maus, Gestures und Drag&Drop .......................................................... 711

26.1 Touch ..................................................................................................................................................... 711

26.2 Maus ..................................................................................................................................................... 718

26.3 Gestures ............................................................................................................................................... 725

26.4 Drag&Drop (macOS) ....................................................................................................................... 728

26.5 Drag&Drop (iOS) .............................................................................................................................. 742

27 Audio, Video und Fotos .................................................................................................... 757

27.1 Audio-Wiedergabe mit dem AVAudioPlayer ............................................................................. 757

27.2 Audio-Wiedergabe mit dem AVPlayer ........................................................................................ 768

27.3 Audio-Wiedergabe mit dem AVPlayerViewController ........................................................... 770

27.4 Audio-Aufnahmenmit dem AVAudioRecorder durchführen .............................................. 772

27.5 Videos abspielen ................................................................................................................................ 777

27.6 Videos mit der Picker-View auswählen und aufnehmen ...................................................... 781

27.7 YouTube-Videos abspielen .............................................................................................................. 785

10

“buch” — 2017/10/6 — 8:49 — page 11 — #7

Inhalt

27.8 Fotos mit der Picker-View auswählen und aufnehmen ......................................................... 788

27.9 Fotos in einer AVCaptureSession aufnehmen .......................................................................... 791

27.10 Barcodes in einer AVCaptureSession erkennen ....................................................................... 799

28 SpriteKit ......................................................................................................................................... 803

28.1 Hello SpriteKit! ................................................................................................................................... 804

28.2 Sprites erzeugen und bewegen .................................................................................................... 813

28.3 Spielsteuerung durch Touch-Ereignisse ..................................................................................... 819

28.4 Bewegungssteuerung (Gyroskop und Accelerometer) .......................................................... 825

28.5 Aktionen ............................................................................................................................................... 832

28.6 Der Game-Loop .................................................................................................................................. 838

28.7 Kollisionserkennung ......................................................................................................................... 840

28.8 Minispiel: Luftballone abschießen .............................................................................................. 845

28.9 Physik .................................................................................................................................................... 852

28.10 Minispiel: Pyramide zerstören ...................................................................................................... 858

28.11 Scene-Editor ........................................................................................................................................ 865

28.12 Partikel-Emitter ................................................................................................................................. 872

29 iCloud ............................................................................................................................................... 875

29.1 iCloud-Grundlagen ........................................................................................................................... 875

29.2 Key/Value-Speicher .......................................................................................................................... 881

29.3 CloudKit-Grundlagen ....................................................................................................................... 888

29.4 CloudKit-Programmiertechniken ................................................................................................. 896

29.5 CloudKit-Beispiel ............................................................................................................................... 906

30 AsynchroneProgrammierung .................................................................................... 919

30.1 Hello Grand Central Dispatch! ...................................................................................................... 920

30.2 GCD-Grundlagen ............................................................................................................................... 923

30.3 Parallel rechnen ................................................................................................................................. 928

30.4 Die Async-Bibliothek ........................................................................................................................ 935

31 App Store und Co. .................................................................................................................. 937

31.1 iOS-Artwork (Icons, Launch Screen) ............................................................................................. 938

31.2 macOS-Artwork (Icon) ..................................................................................................................... 940

31.3 tvOS-Artwork (Parallax-Icons, Launch und Top Shelf Image) ............................................... 941

11

Page 44: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 12 — #8

Inhalt

31.4 Mehrsprachige Apps ........................................................................................................................ 947

31.5 Eigene Apps im App Store anbieten ............................................................................................ 956

31.6 macOS-Programme selbst weitergeben .................................................................................... 964

32 Xcode-Arbeitstechniken .................................................................................................. 971

32.1 Simulator-Ausgaben stoppen ....................................................................................................... 971

32.2 Header-Code einer eigenen Klasse erzeugen ........................................................................... 972

32.3 Versionsverwaltungmit Git ........................................................................................................... 973

32.4 Crashlogs ............................................................................................................................................. 976

32.5 Refactoring .......................................................................................................................................... 977

32.6 Projekte umbenennen ..................................................................................................................... 978

32.7 Xcode-Verzeichnisse aufräumen .................................................................................................. 979

32.8 Apple Configurator ........................................................................................................................... 982

33 Server-side Swift .................................................................................................................... 985

33.1 Swift unter Linux ............................................................................................................................... 988

33.2 Vapor kennenlernen ......................................................................................................................... 995

33.3 Die Vapor-Toolbox ............................................................................................................................. 1004

33.4 Vapor-Grundlagen ............................................................................................................................ 1006

33.5 Datenbankanbindungmit Fluent ................................................................................................ 1017

33.6 Authentifizierung und Autorisierung ......................................................................................... 1028

33.7 Deployment ........................................................................................................................................ 1036

TEIL IV Beispielprojekte

34 New-York-Times-Bestseller ............................................................................................ 1043

34.1 New-York-Times-API ......................................................................................................................... 1045

34.2 Benutzeroberfläche .......................................................................................................................... 1048

34.3 Split-View-Variante ........................................................................................................................... 1053

35 To-do-Listen ................................................................................................................................ 1059

35.1 Gestaltung der Benutzeroberfläche ............................................................................................ 1060

35.2 Datenmodell ....................................................................................................................................... 1061

35.3 View-Controller-Klasse .................................................................................................................... 1062

12

“buch” — 2017/10/6 — 8:49 — page 13 — #9

Inhalt

35.4 Popup-View-Controller-Klasse ...................................................................................................... 1069

35.5 iCloud-Variante .................................................................................................................................. 1070

36 Schatzsuche ................................................................................................................................ 1075

36.1 Aufbau der App .................................................................................................................................. 1075

36.2 Datenmodell ....................................................................................................................................... 1080

36.3 LocationManager selbst gemacht ............................................................................................... 1082

36.4 Steuerelement zur Richtungsanzeige (UIBezierPath) ............................................................ 1086

36.5 Hauptansicht mit Listenfeld .......................................................................................................... 1087

36.6 Popup-Dialog zum Speichern ........................................................................................................ 1092

36.7 Detailansicht mit Richtungspfeil .................................................................................................. 1093

37 Währungskalkulator ........................................................................................................... 1101

37.1 App-Überblick .................................................................................................................................... 1101

37.2 Kurse ermitteln .................................................................................................................................. 1107

37.3 Das Datenmodell der App .............................................................................................................. 1110

37.4 Umrechnungsansicht ....................................................................................................................... 1113

37.5 Einstellungsansicht .......................................................................................................................... 1119

37.6 Internationalisierung und Lokalisierung .................................................................................... 1124

38 Fünf Gewinnt ............................................................................................................................. 1127

38.1 Die App »Fünf Gewinnt« ................................................................................................................. 1127

38.2 Enumerationen und globale Funktionen (Globals.swift) ...................................................... 1130

38.3 Die Spiellogik (FiveWins.swift) ...................................................................................................... 1134

38.4 Darstellung des Spielbretts und der Steine (BoardView.swift) ........................................... 1145

38.5 Steuerung des Spielablaufs (ViewController.swift) ................................................................ 1155

38.6 Der Popup-Dialog (PopupVC.swift) .............................................................................................. 1160

38.7 Erweiterungsmöglichkeiten .......................................................................................................... 1162

39 Icon-Resizer ................................................................................................................................. 1165

39.1 App-Überblick .................................................................................................................................... 1165

39.2 Icons verwalten (IconSize-Struktur) ............................................................................................. 1171

39.3 Hauptfenster (ViewController.swift) ........................................................................................... 1177

39.4 Drag&Drop-Quelle für Icons (IconCellView.swift) ................................................................. 1185

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

13

Page 45: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 14 — #10

Inhalt

39.6 Popup-Menü (IconChoiceVC.swift) .............................................................................................. 1189

39.7 Temporäres Verzeichnis erstellen und löschen ........................................................................ 1190

40 Breakout ........................................................................................................................................ 1193

40.1 Programmaufbau .............................................................................................................................. 1194

40.2 Initialisierung ..................................................................................................................................... 1195

40.3 Spielsteuerung ................................................................................................................................... 1202

41 Pac-Man selbst gemacht ................................................................................................. 1207

41.1 Programmaufbau .............................................................................................................................. 1208

41.2 Der Tile-Editor »Tiled« ...................................................................................................................... 1210

41.3 Globale Konstanten, Datenstrukturen und Enumerationen ............................................... 1214

41.4 Initialisierung des Spiels ................................................................................................................. 1216

41.5 Die Maze-Klasse ................................................................................................................................ 1220

41.6 Aufbau der Spielszene (setup-Methoden) ................................................................................. 1224

41.7 Spielsteuerung (touch-Methoden) .............................................................................................. 1230

41.8 Bewegung des Pac-Mans ................................................................................................................ 1235

41.9 Steuerung der Monster ................................................................................................................... 1239

41.10 Kollisionen ........................................................................................................................................... 1245

41.11 Apple-TV-Variante von Pac-Man ................................................................................................... 1249

41.12 Pac-Man-Figuren zeichnen ............................................................................................................. 1252

42 Asteroids ........................................................................................................................................ 1255

42.1 Programmaufbau .............................................................................................................................. 1256

42.2 Globale Konstanten und Funktionen .......................................................................................... 1258

42.3 Programmstart und Tastaturereignisse (GameViewController) ......................................... 1258

42.4 Initialisierung des Spiels (GameScene) ....................................................................................... 1261

42.5 Spielablauf (ebenfalls in GameScene) ........................................................................................ 1267

42.6 FokussierbareMenütexte (MyLabel) ........................................................................................... 1273

42.7 Der Einstellungsdialog (MainScene) ........................................................................................... 1274

Index .................................................................................................................................................................... 1281

14

Page 46: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1281 — #1277

Index

_-Zeichen (Wildcard-Pattern) .......................................... 72

&-Zeichen (inout-Parameter) ....................................... 142

A

AAC-Format ............................................................................. 759

Abort-Struktur (Vapor) .................................................. 1010

abs-Funktion .......................................................................... 146

Abstand zwischen zwei Koordinaten-

punkten ......................................................................... 1096

Accelerometer ........................................................................ 825

accelerometerUpdateInterval-Eigenschaft ......... 827

acceptsFirstResponder-Eigenschaft ........................ 539

accountStatus-Methode .................................................. 896

action-Eigenschaft (NSMenuItem) ........................... 553

action-Parameter

addTarget ........................................................................... 433

Gesture Recognizer .................................................... 1063

Actions ............................................................................. 380, 405

macOS ................................................................................... 515

SpriteKit ............................................................................... 832

umbenennen ..................................................................... 386

activateFileViewerSelecting-Methode ................. 1179

Activity-Indictator-View .................................................. 920

adaptivePresentationStyle-Methode ..................... 495

add-Methode .......................................................................... 167

addAction-Methode ........................................................... 504

addButtonWithTitle-Methode .................................... 534

addConstraint-Methode ................................................. 434

addGestureRecognizer-Methode .............................. 728

adding-Methode ................................................................... 167

addInput-Methode ............................................................. 794

addInteraction-Methode ................................................ 745

addObserver-Methode ............................. 699, 883, 1085

addOutput-Methode ......................................................... 794

addSublayer-Eigenschaft ................................................ 778

addSubview-Methode .............. 433, 1122, 1150, 1182

addTarget-Methode ........................................................... 433

Adjust-Scroll-View-Insets-Option .......................... 1049

afconvert-Kommando ...................................................... 759

affectedByGravity-Eigenschaft ................................... 857

Aktionen (SpriteKit) ........................................................... 832

Aktuelles Verzeichnis ermitteln/ändern .............. 588

Alert-Dialog ............................................................................. 503

alertStyle-Eigenschaft ...................................................... 535

Align-Button ........................................................................... 418

alignment-Eigenschaft .................................................... 658

Stack-View .......................................................................... 436

all-Methode (Vapor/Fluent) ....................................... 1021

allowsRotation-Eigenschaft .......................................... 857

alpha-Eigenschaft .................................................. 708, 1248

SpriteKit ............................................................................... 815

alternate-Eigenschaft ........................................................ 720

Ambiguous Use of Function (Fehlermeldung) 134

anchorPoint-Eigenschaft .................................. 814, 1218

angularDamping-Eigenschaft ....................... 857, 1201

angularVelocity-Eigenschaft ........................................ 857

animate-Methode ....................................... 706, 834, 1150

Animationen .......................................................................... 706

im Spiel 5-Gewinnt ...................................................... 1150

SpriteKit-Aktionen ............................................ 834, 1227

Any-Datentyp ......................................................................... 319

AnyClass-Datentyp ............................................................. 320

AnyObject-Datentyp .......................................................... 319

Apache-Konfiguration (Vapor) ................................. 1038

API-Design-Richtlinien .................................................... 141

API-Version testen ............................................................... 115

App

Archiv erzeugen .............................................................. 962

auf iOS-Geräten ausführen ...................................... 398

beenden ............................................................................... 565

Bundle-Dateien ............................................................... 584

HelloWorld ........................................................................ 373

Icon ........................................................................... 938, 1165

ID ............................................................................................. 958

im App Store einreichen ............................................. 962

im Simulator ausprobieren ...................................... 378

Lebenszyklus ..................................................................... 414

Lokalisierung .................................................................... 947

Name ..................................................................................... 940

Sprache ................................................................................. 947

User-Defaults .................................................................... 577

weitergeben (iOS) ........................................................... 956

weitergeben (macOS) ................................................... 964

Willkommensbildschirm ........................................... 939

App Store ................................................................................... 956

App Transport Security ...................................... 626, 1053

AppDelegate-Klasse ......................................................... 1190

Init-Funktion ..................................................................... 530

iOS ........................................................................................... 415

Split-View-Controller-Beispiel ................................. 488

appdmg-Kommando ........................................................ 968

append-Methode ................................................................. 213

Zeichenketten ................................................................... 192

appendArc-Methode ......................................................... 722

1281

Page 47: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1282 — #1278

Index

appendBezierPathWithRoundedRect-

Methode ........................................................................... 733

appendingPathComponent-Methode ................... 583

appendingPathExtension-Methode ........................ 583

Apple Configurator ............................................................. 982

Apple Developer Program ...................................... 22, 399

AppleMovie Trailers .......................................................... 661

Apple TV .................................................................................... 555

Asteroids-Spiel .............................................................. 1255

Pac-Man ............................................................................ 1249

application-Methode ........................................................ 415

applicationDidBecomeActive-Methode ............... 415

applicationDidEnterBackground-Methode ........ 415

applicationDidFinishLaunching-Methode ...... 1190

applicationWillEnterForeground-Methode ....... 415

applicationWillResignActive-Methode ................. 415

applicationWillTerminate-Methode .......... 416, 1190

applyAngularImpulse-Methode ................................ 858

applyForce-Methode ......................................................... 858

applyImpulse-Methode ........................................ 858, 863

applyTorque-Methode ...................................................... 858

ARC ................................................................................................ 282

arch-Test .................................................................................... 116

Archiv (Xcode) ....................................................................... 962

arguments-Eigenschaft ................................................... 369

Arrays ........................................................................................... 207

Array-Struktur erweitern ........................................... 324

assoziative .......................................................................... 226

auslesen ............................................................................... 211

Doppelgänger entfernen ........................................... 226

durchwürfeln .................................................................... 225

filter, map und reduce ................................................. 220

Fixed Sized Arrays .......................................................... 216

initialisieren ...................................................................... 210

mehrdimensionale .......................................... 216, 1132

sortieren ............................................................................... 214

verändern ........................................................................... 213

zweidimensionale ....................................................... 1132

ArraySlice-Datentyp ........................................................... 212

ArrowView-Klasse (Beispiel) ...................................... 1086

as-Operator ................................................ 78, 297, 298, 331

Aspect-Fill-Einstellung .......................................... 431, 457

Aspect-Fit-Einstellung ........................................... 431, 457

assert-Funktion .................................................................... 345

Assets ........................................................................................... 584

Bitmaps ................................................................................ 585

CloudKit .................................................................... 878, 891

Farben ................................................................................... 586

speichern (CloudKit) ..................................................... 898

Assets.xcassets-Datei ........................................................ 455

Associated Values ................................................................ 252

Associated Type Constraints ........................................ 312

associatedtype-Schlüsselwort ..................................... 312

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

Assoziative Arrays ............................................................... 226

Assoziativität ............................................................................. 86

Asteroids-Spiel .................................................................... 1255

Async-Bibliothek .................................................................. 935

async-Methode ........................................................... 609, 922

CloudKit-Beispiel ............................................................ 912

Trailer-Beispiel ...................................................... 666, 667

asyncAfter-Funktion ............................................ 925, 1133

Asynchrone Programmierung .................................... 919

Asynchroner Download .................................................. 604

Atlas (SpriteKit) ....................................................... 833, 1209

Atomic Transaction (CloudKit) ................................... 891

atomically-Parameter ....................................................... 595

ATS (App Transport Security) ...................................... 602

attitude-Eigenschaft .......................................................... 828

Attribute .................................................................................... 363

attribute-Methode .............................................................. 610

attributesOfFileSystem-Eigenschaft ....................... 560

attributesOfItem-Methode ............................................ 591

Audio ............................................................................................ 757

aufnehmen ........................................................................ 772

beschleunigt wiedergeben ........................................ 770

Bibliotheken ...................................................................... 758

Datei abspielen ................................................................ 759

Formate ............................................................................... 759

SpriteKit-Aktion ............................................................... 834

Stream abspielen ............................................................ 769

audioRecorderDidFinishRecording-Methode .. 775

AudioServicesPlaySystemSound-Funktion ........ 768

Aufräumarbeiten durchführen (defer) .................. 132

Auth- und AuthProvider-Bibliothek (Vapor) ... 1029

Authentifizierung (Vapor) ........................................... 1028

Auto Layout .................................................................. 388, 417

deaktivieren ....................................................................... 418

Maßeinheit ......................................................................... 417

Regeln durch Code definieren ................................. 433

Varianten ............................................................................ 440

Auto-Fokus (Kamera) ........................................................ 800

autoclosure-Attribut .......................................................... 157

autoFocusRangeRestriction-Eigenschaft ............. 800

Automatic Reference Counting .................................. 282

Autoresizing-Option ......................................................... 429

available-Attribut ................................................................. 363

available-Test .......................................................................... 115

availableFonts-Methode ................................................. 536

AVAsset-Klasse ....................................................................... 768

AVAudioPlayer-Klasse ....................................................... 759

AVAudioRecorder-Klasse ................................................. 772

AVAudioRecorderDelegate-Protokoll ...................... 775

AVAudioSession-Klasse .................................................... 773

AVCaptureDevice-Klasse ................................................. 791

AVCaptureDeviceDiscoverySession-Klasse ........ 795

1282

“buch” — 2017/10/6 — 8:49 — page 1283 — #1279

Index

AVCaptureDeviceInput-Klasse .................................... 791

AVCaptureMetadataOutputObjectsDelegate-

Protokoll .......................................................................... 799

AVCapturePhotoCaptureDelegate-Protokoll ..... 791

AVCapturePhotoOutput-Klasse ....................... 791, 799

AVCapturePhotoSettings-Klasse ..................... 791, 796

AVCaptureSession-Klasse ............................................... 791

AVCaptureVideoPreviewLayer-Klasse .................... 791

AVEncoderAudioQualityKey-Konstante ............... 775

AVFormatIDKey-Konstante ........................................... 775

AVFoundation-Bibliothek .............................................. 758

AVItem-Klasse ........................................................................ 768

AVKit-Bibliothek ................................................................... 758

AVNumberOfChannelsKey-Konstante .................. 775

AVPlayer-Klasse .................................................................... 768

in einem AVPlayerViewController ........................ 770

AVPlayerItemDidPlayToEndTime-Konstante .... 769

AVPlayerLayer-Klasse ........................................................ 778

AVPlayerViewController-Klasse ................................. 770

Video abspielen ............................................................... 777

AVSampleRateKey-Konstante ...................................... 775

B

Back-Button ............................................................................. 472

Background Capabilities ...................................... 677, 763

backgroundColor-Eigenschaft

Collection-View-Zelle ................................................... 666

SpriteKit ............................................................................. 1217

UIView ................................................................................ 1150

Badge-Eigenschaft (Tab-Bar-Item) ............................ 479

Bar-Button-Item ................................................................... 473

Barcodes erkennen ............................................................. 799

bcrypt-Algorithmus ........................................................ 1035

bcrypt.json-Datei (Vapor) ............................................ 1035

Bearer-Token (Vapor) ...................................................... 1030

Bechmarktests ....................................................................... 205

becomeFirstResponder-Methode .... 452, 539, 1069

Beispiel ............................................................................... 1092

Bedingte Protokollerweiterungen ............................ 329

beginDraggingSession-Methode ............................... 730

beginRefreshing-Methode ............................................ 649

Benannte Parameter ......................................................... 128

in Protokollen ................................................................... 305

Init-Funktion ..................................................................... 267

Benutzernamen feststellen .......................................... 903

Beschleunigungsmesser ................................................. 825

Beta-Versionen installieren (iOS, tvOS) ................. 982

Bewegungssteuerung ....................................................... 825

Bibliotheken (Server-side Swift) ................................. 992

Bild herunterladen ............................................................. 602

Binäre Datei herunterladen .......................................... 602

Binäre Daten ........................................................................... 201

Binäre Zahlen ......................................................................... 166

Binärer Operator ..................................................................... 84

BinaryFloatingPoint-Protokoll ................................... 167

BinaryInteger-Protokoll ....................................... 313, 324

Bitmap-Literale ..................................................................... 811

bitmapLiteral-Schlüsselwort ........................................ 811

Bitmaps

als PNG-Datei speichern ............................ 1175, 1252

Atlas .......................................................................... 833, 1209

erzeugen (macOS) ....................................................... 1254

für Sprites ............................................................................ 813

Images.xcassets-Datei ..................................... 455, 639

NSImage-Klasse ........................................................... 1173

skalieren ........................................................................... 1173

UIImage-Klasse ............................................................... 639

Bitweises Rechnen ................................................................. 75

blendMode-Eigenschaft ............................................... 1248

Bodies (SpriteKit) ................................................................. 856

bodyA/bodyB-Eigenschaft ............................................ 845

Bool-Datentyp ....................................................................... 170

Boolesche Werte ................................................................... 170

boolValue-Eigenschaft ..................................................... 591

borderColor-Eigenschaft ................................................ 413

borderWidth-Eigenschaft ............................................... 413

Bottom Layout Guide ....................................................... 432

bounds-Eigenschaft ............. 499, 689, 719, 847, 1153

Box2D-Engine ........................................................................ 852

break-Schlüsselwort

Schleifen .............................................................................. 119

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

brew-Kommando ...................................................... 968, 995

Bridging-Header-Datei ..................................................... 366

brighter-Methode ............................................................. 1132

Bundle-Dateien ..................................................................... 584

Bundle-ID .................................................................................. 957

in iTunes Connect .......................................................... 960

Bundle-Klasse ......................................................................... 584

Buttons

iOS ........................................................................................... 377

macOS ................................................................................ 1168

Textured Button ........................................................... 1168

buttonWithType-Methode ............................................ 433

C

Cache-Verzeichnis ............................................................ 1111

cachesDirectory-Konstante .......................................... 587

CAF-Format .............................................................................. 759

CALayer-Klasse .............................................. 413, 778, 1150

Camera Roll ............................................................................. 788

cameraDevice-Eigenschaft ............................................ 790

canBecomeFocused-Eigenschaft ............................... 568

Asteroids-Spiel .............................................................. 1273

in SpriteKit-Apps ............................................................. 572

cancelOperation-Methode ............................................ 540

1283

Page 48: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1284 — #1280

Index

canCreateDirectories-Eigenschaft ............................ 535

canEditRowAt-Parameter ............................................ 1067

canMoveRowAt-Parameter ........................................ 1067

Canvas-Value-Einstellung ............................................... 422

Capabilities ................................................................... 677, 763

Maps ...................................................................................... 675

capacity-Eigenschaft ......................................................... 215

capitalized-Eigenschaft ................................................... 186

Capture List ............................................................................. 161

capture-Methode ...................................................... 791, 799

Capture-Session

Barcodes erkennen ........................................................ 799

Fotos aufnehmen ........................................................... 791

capturePhoto-Methode ........................................ 791, 796

Capturing Values .................................................................. 159

Carthage .................................................................................... 361

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

Casting ............................................................................. 297, 331

catch-Schlüsselwort ................................................ 338, 340

categoryBitMask-Eigenschaft ........................... 843, 857

cellForRow-Parameter ...................................................... 632

CG-Kürzel .................................................................................. 702

CGColor-Klasse ...................................................................... 413

CGContext-Klasse .................................................. 702, 1174

CGContextAddArc-Methode ........................................ 695

CGContextDrawPath-Methode ................................... 695

CGFloat-Datentyp ................................................................ 172

CGFloat-Typ ............................................................................. 397

CGImage-Klasse ................................................................. 1174

CGImageDestination-Klasse ..................................... 1175

CGImageDestinationFinalize-Funktion ............. 1175

CGMotion-Klasse ................................................................. 830

cgPath-Eigenschaft ............................................................. 860

CGPoint-Struktur ...................................................... 171, 719

erweitern ............................................................................. 176

CGRect-Struktur .............................................. 171, 658, 719

erweitern ............................................................................. 175

CGSize-Struktur ......................................................... 171, 719

CGVector-Struktur .............................................................. 171

changeCurrentDirectoryPath-Methode ............... 588

changeFont-Methode ....................................................... 536

Character-Datentyp ........................................................... 179

characters-Eigenschaft ..................................................... 540

CharacterSet-Struktur ...................................................... 187

childNode-Methode ............................................. 870, 1276

children-Eigenschaft ......................................................... 332

CKAccountChanged-Notification ............................. 897

CKAsset-Klasse ...................................................................... 898

CKContainer-Klasse ................................................. 896, 903

CKModifyRecordOperation-Klasse .......................... 898

CKQuery-Klasse .................................................................... 900

CKQueryOperation-Klasse ............................................ 900

CKRecord-Klasse ....................................................... 898, 900

CKRecordID-Klasse .................................................. 899, 903

CKRecordZone-Klasse ....................................................... 891

CKReference-Klasse ........................................................... 899

CKUserIdentity-Klasse ..................................................... 903

Class and Subtype Existentials ................................... 308

class-Schlüsselwort .................................................. 244, 275

clipToBounds-Eigenschaft ............................................. 457

CLLocation-Klasse ............................................................ 1096

CLLocationManager-Klasse ................................ 672, 679

Kompass .............................................................................. 683

teilen ................................................................................... 1082

CLLocationManagerDelegate-Protokoll ..... 678, 683

close-Methode ....................................................................... 525

Closed-Range-Operator ...................................................... 80

closePath-Methode .......................................................... 1086

Closures ..................................................................................... 154

Auto-Closures ................................................................... 157

Capture List ........................................................................ 161

Capturing Values ............................................................ 159

für Lazy Properties ........................................................ 256

Fehler (rethrows) ............................................................. 350

in Animationen ............................................................... 706

throws/rethrows ............................................................. 351

Trailing Closures ............................................................. 155

UIAlert-Beispiel ................................................................ 504

unowned self .......................................................... 161, 707

verzögert ausführen ....................................... 925, 1133

weak ....................................................................................... 161

Cloud (iCloud) ........................................................................ 875

CloudKit .......................................................................... 876, 888

CMCoreMotionManager-Klasse ................................ 827

CMTime-Struktur ..................................................... 769, 780

cmysql-Bibliothek ............................................................ 1026

Cocoa Touch ............................................................................ 409

Cocoa-Framework ............................................................... 508

CocoaPods ................................................................................ 361

YouTube-Beispiel ............................................................ 785

Codable-Protokoll .................................................. 614, 1080

CodingKeys-Enumeration (JSON) ............................. 617

Collection-View-Steuerelement ................................. 661

Beispiel zur Farbauswahl .......................................... 886

Foto-App .............................................................................. 797

Hintergrund unsichtbar ............................................. 797

collisionBitMask-Eigenschaft ........................... 844, 857

Color Panel ............................................................................... 537

Color Well .................................................................................. 537

color-Eigenschaft ................................................................. 537

SpriteKit ............................................................................... 815

colorBlendFactor-Eigenschaft ..................................... 815

command-Eigenschaft ..................................................... 720

CommandLine-Enumeration ......................................... 35

Comparable-Protokoll ...................................................... 318

compare-Methode .............................................................. 186

1284

“buch” — 2017/10/6 — 8:49 — page 1285 — #1281

Index

CompassView-Steuerelement (Beispiel) ............... 694

Compiler ...................................................................................... 38

completion-Parameter ....................................... 707, 1161

components-Methode ........................................... 192, 204

Zeichenketten in Zeilen zerlegen .......................... 369

compositingOperation-Eigenschaft .................... 1253

Compound Types ................................................................ 234

Compression Resistance Priority .............................. 438

Computed Properties ............................................... 96, 259

Extensions .......................................................................... 327

Fehler auslösen ................................................................ 349

preferredContentSize ................................................... 497

prefersStatusBarHidden ............................................ 438

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

concludeDragOperation-Methode ................ 730, 741

Concurrent Queues ............................................................ 923

Config-Klasse (Vapor) ..................................................... 1007

Connections Inspector .......................................... 631, 652

constrainMaxCoordinate-Parameter .................. 1181

constrainMinCoordinate-Parameter ................... 1181

Constraints (Auto Layout) ................................... 388, 417

contactBitMask-Eigenschaft ........................................ 843

contactTestBitMask-Eigenschaft ............................... 858

Container (CloudKit) ......................................................... 889

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

contains-Methode ................... 173, 219, 230, 232, 738

Content Compression ...................................................... 428

Content Compression Resistance Priority .......... 438

Content Hugging ................................................................. 428

contentMode-Eigenschaft ............................................. 716

eigene Steuerelemente ................................................ 698

Image-View ............................ 431, ............................ 457

contentOverlayView-Eigenschaft ............................. 771

contents-Eigenschaft ........................................................ 735

contentsOfDirectory-Methode ................................... 589

continue-Schlüsselwort .................................................. 120

continuousAutoFocus-Enumerationswert ........ 800

Control Center ......................................................... 812, 1196

control-Eigenschaft ............................................................ 720

Controller ................................................................................. 376

Vapor .................................................................................. 1022

controllers-Eigenschaft ................................................... 830

Convenience Init Function ............................................ 268

Vererbung ........................................................................... 293

convenience-Schlüsselwort .......................................... 268

convert-Methode ........................................ 720, 735, 1185

Fonts ...................................................................................... 536

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

copyItem-Methode ............................................................. 593

Core Data ................................................................................... 590

Core Graphics ......................................................................... 702

Core Libraries ........................................................................ 992

Core Location (CL) ............................................................... 672

CoreAudio-Bibliothek ....................................................... 758

CoreMotion-Bibliothek .................................................... 827

cornerRadius-Eigenschaft .............................................. 413

count-Eigenschaft ......................................... 184, 211, 229

CountableClosedRange-Struktur ................................. 80

CountablePartialRangeFrom-Struktur ..................... 80

CountableRange-Struktur ................................................ 80

Crashlogs ................................................................................... 976

createArray2D-Funktion .............................................. 1132

createDirectoryAtPath-Methode ............................ 1191

cRnd-Funktion ....................................................................... 847

crypto.json-Datei (Vapor) ............................................ 1035

currentDirectoryPath-Eigenschaft ........................... 588

currentTime-Eigenschaft ............................................... 769

CustomStringConvertible-Protokoll ......... 314, 1080

D

darker-Methode ................................................................. 1132

Dashboard (iCloud) ............................................................ 892

data-Methode ......................................................................... 201

String ..................................................................................... 617

Data-Source-Protokoll ...................................................... 656

NSTableView ..................................................................... 652

UITableView ...................................................................... 632

Data-Struktur ................................................. 201, 602, 1081

dataEncodingStrategy-Eigenschaft ......................... 615

dataSource-Eigenschaft

NSTableView ..................................................................... 652

UICollectionView ............................................................ 666

UIPickerView .................................................................. 1120

UITableView ...................................................................... 631

date-Methode

Calendar .............................................................................. 205

DateFormatter ................................................................. 204

Date-Struktur ......................................................................... 203

tvOS-Beispiel ..................................................................... 558

dateEncodingStrategy-Eigenschaft ......................... 615

dateFormat-Eigenschaft .................................................. 203

DateFormatter-Klasse ....................................................... 203

Dateien ....................................................................................... 577

auswählen .......................................................................... 533

Eigenschaften ermitteln ............................................. 590

Größe ermitteln ............................................................... 590

kopieren ............................................................................... 593

löschen ................................................................................. 593

temporäre Datei ............................................................. 588

testen, ob Datei existiert ............................................ 583

Textdateien lesen/schreiben .................................... 595

URLs ....................................................................................... 582

verschieben ........................................................................ 593

Dateisystem (Größe ermitteln) ................................. 560

1285

Page 49: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1286 — #1282

Index

Datenbanken

CloudKit ............................................................................... 890

Vapor/Fluent .................................................................. 1017

Datenquelle im Connections Inspector

einstellen .............................................................. 631, 652

Datensatz speichern (CloudKit) ................................. 898

Datentypen .............................................................................. 104

Aliasse ................................................................................... 281

ermitteln ...................................................................... 78, 331

Funktionstypen ............................................................... 150

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

deadline-Parameter .............................................. 925, 1133

decimalSeparator-Eigenschaft ................................. 1117

Decodable-Protokoll .......................................................... 614

decode-Methode .................................................................. 621

default-Schlüsselwort (switch) ................................... 113

defaultManager-Methode ........................................... 1190

DefaultPrecedence (Operatoren) ................................. 86

defaults-Kommando ......................................................... 581

Defaultwerte für Parameter .......................................... 144

defer-Schlüsselwort ........................................................... 132

in try-catch-Konstruktionen .................................... 344

Deinit-Funktion ......................................................... 271, 282

Dekrement-Operator ........................................................... 74

delay-Funktion ................................................................... 1133

delegate-Eigenschaft

AVAudioRecorder ............................................................ 775

CLLocationManager .................................................... 679

MKMapView ..................................................................... 679

NSApplicationDelegate .............................................. 531

NSFontManager ............................................................. 536

NSTableView ........................................................ 652, 1184

UIApplication ................................................................... 416

UIPickerView .................................................................. 1120

UIPopoverPresentationController ............ 495, 502

UITableView ...................................................................... 631

UITapGestureRecognizer ........................................ 1118

UITextField ........................................................... 450, 1117

Delegation .......................................................... 304, 405, 449

Beispiel für eigenes Delegation-Protokoll .... 1097

CLLocationManagerDelegate-Beispiel ............. 678

im Connections Inspector einstellen ....... 631, 652

NSTableView ........................................................... 652, 656

SetPieceDelegate-Beispiel ...................................... 1145

UITableView ...................................................................... 631

UITextFieldDelegate-Beispiel .................................. 450

delete-Methode (Vapor) ................................................ 1008

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

deleteRows-Methode ...................................................... 1067

deleteSelf-Konstante ......................................................... 899

deleteXxx-Methoden (NSEvent) ................................ 540

deletingLastPathComponent-Methode ................ 583

deletingPathExtension-Methode ............................. 583

density-Eigenschaft ........................................................... 857

Deployment (Vapor) ....................................................... 1036

dequeueReusableCell-Methode ...................... 632, 635

DerivedData-Verzeichnis ................................................ 980

description-Eigenschaft .................................... 314, 1080

Designated Init Function ............................................... 268

Vererbung ........................................................................... 293

desiredAccuracy-Eigenschaft ...................................... 679

destination-Eigenschaft .................................................. 467

destinationIndexPath-Eigenschaft .......................... 754

detailTextLabel-Eigenschaft ......................................... 636

Developer Program .................................................... 22, 399

Development Environement (CloudKit) .............. 891

Device Orientation ............................................................. 825

deviceMotionUpdateInterval-Eigenschaft ......... 827

devices-Eigenschaft ........................................................... 795

Devie Orientation ............................................................... 825

Dictionaries ............................................................................. 226

Dictionary-Datentyp (Hashable) ............................... 316

didBegin-Methode (Kollisionen) .................. 845, 1204

Luftballon-Beispiel ........................................................ 851

Pac-Man ............................................................................ 1245

didChangeExternallyNotification-Konstante ... 883

didEnd-Methode (Kollisionserkennung) ............. 845

didFinishDownloadingTo-Parameter .................... 606

didFinishProcessingPhotoSampleBuffer-

Parameter ....................................................................... 796

didMove-Methode .............................................................. 473

didReceiveMemoryWarning-Methode .................. 411

didSelectRow-Parameter ............................................. 1124

didSet-Funktion ............................. 257, 290, 1062, 1114

Beispiel .................................................................... 694, 1153

didUpdateFocus-Methode .................... 568, 571, 1278

Trailer-Beispiel ................................................................. 669

discardableResult-Attribut ................................. 131, 364

discoverUserIdentity-Methode .................................. 903

Disk-Image ............................................................................... 968

dismiss-Methode ...................................................... 503, 523

dismissController ................................................................ 524

dismissViewControllerAnimated-Methode .... 1161

Dispatch-Framework ......................................................... 919

DispatchGroup-Klasse ...................................................... 924

DispatchQoS.QoSClass-Enumeration .................... 924

DispatchQueue-Klasse ............................ 922, 925, 1133

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

Trailer-Beispiel ................................................................. 666

DispatchTime-Klasse ........................................... 925, 1133

distanceFromLocation-Methode ............................ 1096

distanceTo-Methode .......................................................... 176

Distribution Provisioning Profile ............................. 956

distribution-Eigenschaft ................................................ 436

Division durch null ............................................................... 74

DMG-Datei erstellen .......................................................... 968

1286

“buch” — 2017/10/6 — 8:49 — page 1287 — #1283

Index

do-Schlüsselwort (try-catch) ........................................ 338

Docker ......................................................................................... 989

Vapor .................................................................................. 1003

Document-Outline-Seitenleiste ................................ 394

documentDirectory-Konstante .................................. 587

Dokumentenbasierte Apps ........................................... 877

domain-Eigenschaft .......................................................... 356

Doppelgänger im Array entfernen .......................... 226

Doppelte Optionals ............................................................ 343

Double-Datentyp ................................................................. 166

Double-Init-Funktion ....................................................... 200

Downcast ................................................................ 78, 297, 331

Downloads per HTTP/HTTPS ....................................... 601

einer inaktiven App fortsetzen ............................... 605

im Hintergrund ............................................................... 604

downloadsDirectory-Konstante ................................ 587

downloadTask-Methode ................................................. 606

Drag&Drop ............................................................................ 728

Dateinamen empfangen ............................. 737, 1186

Dateinamen senden .................................................. 1185

iOS ........................................................................................... 742

macOS ................................................................................... 728

UITableView-Steuerelement .................................... 749

weitergeben .................................................................... 1178

Zeichenkette empfangen ........................................... 737

Zeichenkette senden ..................................................... 735

dragDelegate-Eigenschaft .............................................. 751

draggingEntered-Methode .............................. 729, 1187

draggingExited-Methode ..................................... 729, 741

draggingPasteboard-Methode .................................... 740

draggingSession-Methode .................... 730, 736, 1185

draggingUpdated-Methode .......................................... 729

dragInteraction-Methode .................................... 743, 746

drand48-Funktion ................................................. 169, 1134

draw-Funktion .................................................................... 1174

draw-Methode ............................................... 541, 722, 1173

5-Gewinnt-Beispiel ...................................................... 1149

Drag-und-Drop-Beispiel ............................................. 733

Grafikprogrammierung ............................................. 689

Hintergrundfarbe .......................................................... 693

drawRect-Methode .......................................................... 1086

drawsBackground-Eigenschaft ................................... 658

dRnd-Funktion ...................................................................... 847

drop-Methode ........................................................................ 219

dropDelegate-Eigenschaft ............................................. 751

Dropdown-Liste ................................................................. 1119

dropFirst-Methode ............................................................. 218

dropInteraction-Methode ................................... 743, 747

dropLast-Methode .............................................................. 218

Droplet-Klasse (Vapor) .................................................. 1006

dropSessionDidUpdate-Parameter .......................... 753

dynamic-Schlüsselwort ................................................... 248

E

EAN8/EAN13-Barcode ....................................................... 800

Edges (SpriteKit) ................................................................... 856

Eigenschaften ......................................................................... 254

beobachten ........................................................................ 257

Computed Properties ................................................... 259

Extensions .......................................................................... 327

Fehler auslösen ................................................................ 349

Read-Only-Eigenschaft ............................................... 261

statische Eigenschaften .............................................. 259

Zugriff mit Optional Chaining ............................... 103

Zugriff per KeyPath ....................................................... 333

Eingabefokus einstellen ............................................... 1069

Einstellungen (iOS) öffnen ............................................ 896

Einstellungen (macOS) .................................................... 526

element-Methode ............................................................... 610

else-Schlüsselwort ............................................................... 107

guard ..................................................................................... 110

Emitter (SpriteKit) ............................................................... 872

Encodable-Protokoll .......................................................... 614

encode-Methode ....................................................... 615, 621

endedAtPoint-Parameter ............................................... 730

endEditing-Methode ........................................... 450, 1118

endIndex-Eigenschaft ....................................................... 193

endRefreshing-Methode ................................................. 649

enum-Schlüsselwort ............................................................. 97

Beispiele ............................................................................ 1130

Enumerationen

als Datentypen ................................................................ 250

Associated Values .......................................................... 252

Beispiel ............................................................................... 1171

Beispiele ............................................................................ 1130

indirekt/rekursiv ............................................................. 253

zur Definition von Konstanten ................................. 97

Ephemeral-Konfiguration (URLSession) .............. 605

equalTo-Methode ................................................................ 173

Equatable-Protokoll ................................................ 316, 325

als Extension implementieren ................................ 324

Erdbeschleunigung ............................................................ 828

Error-Protokoll ...................................................................... 354

escaping-Attribut ...................................................... 162, 364

Eulersche Zahl ........................................................................ 148

Exceptions ..................................................................... 337, 349

exit-Funktion ......................................................................... 565

Exit-Icon (ViewController) ............................................. 463

Exponential-Operator ......................................................... 89

ExpressibleByStringLiteral-Protokoll ..................... 320

Extended Grapheme Cluster ........................................ 183

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

Beispiele ............................................................................ 1132

bequemer Zeichenkettenzugriff ............................ 195

eigene map-Methode .................................................. 352

Protokolle ........................................................................... 328

1287

Page 50: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1288 — #1284

Index

F

Fünf-Gewinnt-App ........................................................... 1127

Fade-In-Effekt ......................................................................... 708

fadeAlpha-Methode ........................................................... 833

fadeIn-Methode .................................................................... 833

fadeOut-Methode ................................................................ 833

Failable Init Functions ...................................................... 269

fallthrough-Schlüsselwort (switch) ......................... 113

false ............................................................................................... 170

familyName-Eigenschaft ................................................ 903

Farb-Literale ............................................................................ 811

Farben

abdunkeln ........................................................................ 1132

auswählen .......................................................................... 533

aufhellen ........................................................................... 1132

Fatal Error ................................................................................. 337

fatalError-Funktion ............................................................ 137

Fehler

Absicherung ...................................................................... 337

auslösen (throw) ............................................................. 346

do-try-catch ....................................................................... 338

NSError-Klasse ................................................................. 355

Weitergabe ......................................................................... 342

Fenster

ausblenden ......................................................................... 554

Größe fixieren ........................................................ 512, 524

in den Vordergrund bringen .................................... 553

per Code erzeugen ......................................................... 525

schließen .............................................................................. 524

Fernbedienung (Apple TV) ............................... 561, 1260

fetchUserRecordID-Methode ...................................... 903

FileAttributeKey-Struktur .............................................. 591

fileExists-Methode .............................................................. 591

fileExistsAtPath-Methode ........................................... 1190

FileManager-Klasse ............................................................ 587

Dateioperationen .......................................................... 590

Standardverzeichnisse ermitteln .......................... 587

fileprivate-Schlüsselwort ................................................ 247

fileURL-Eigenschaft (CloudKit) ................................... 900

fileURL-Konstante ............................................................... 732

fill-Methode ............................................................... 691, 1086

fillColor-Eigenschaft .......................................................... 816

filter-Methode ............................................................. 187, 220

Dictionaries ....................................................................... 230

Fluent-Datensätze ...................................................... 1021

Sets .......................................................................................... 231

final-Schlüsselwort .................................................. 248, 293

finally-Schlüsselwort ......................................................... 344

find-Methode (Vapor/Fluent) ................................... 1021

Finder per Code anzeigen ............................................ 1179

First Responder ....................................................... 544, 1069

Menüs .................................................................................. 546

Tastatur (iOS) .................................................................... 452

Tastatur (macOS) ........................................................... 538

first-Eigenschaft ............................................. 193, 211, 218

first-Methode (Vapor/Fluent) ................................... 1021

Fixed Sized Arrays ............................................................... 216

Fixed-width-constraints-Warnung .......................... 431

flagsChanged-Methode ................................................... 539

flashMode-Eigenschaft .................................................... 796

flatMap-Methode ................................................................. 221

Fließkommazahlen ............................................................ 166

FloatingPoint-Protokoll ................................................... 167

Fluent-Bibliothek (Vapor) ............................................ 1017

fluent.json-Datei (Vapor) ............................................. 1025

Focus Engine (Apple TV) .................................................. 567

Asteroids-Beispiel ........................................................ 1273

focusMode-Eigenschaft ................................................... 800

Fokus-Einstellung (Kamera) ......................................... 800

follow-Methode .................................................................... 832

Font auswählen ..................................................................... 533

Font Manager ......................................................................... 536

Font Panel ................................................................................. 536

Font-Attribute ändern ...................................................... 532

font-Eigenschaft ................................................................... 397

for-in-Schleife ........................................................................ 117

Forced Try ................................................................................. 343

forces-Eigenschaft ............................................................... 712

forEach-Methode ................................................................. 222

Foreign-Key-Fehler (MySQL) ...................................... 1025

Formatieren

Datum und Uhrzeit ...................................................... 203

Zahlen ................................................................................... 199

Fotos

aus der Camera-Roll auswählen ........................... 788

in einer Capture-Session aufnehmen ................. 791

mit der Picker-View aufnehmen ........................... 790

Foundation-Framework ..................................................... 33

frame-Eigenschaft .............................. 433, 658, 719, 735

SKNode-Klasse ................................................................. 840

Frameworks ............................................................................. 359

Server-side Swift .............................................................. 986

Xcode ..................................................................................... 675

Free Provisioning ................................................................ 398

friction-Eigenschaft ........................................................ 1201

front-Enumerationswert ................................................ 790

Front-Kamera ......................................................................... 795

func-Schlüsselwort ............................................................. 127

Funktionale Programmierung .................................... 149

Funktionen .............................................................................. 127

als Parameter ................................................................... 151

als Rückgabewert ........................................................... 152

Funktionstypen ............................................................... 150

Gültigkeitsebenen .......................................................... 135

globale Funktionen ....................................................... 145

1288

“buch” — 2017/10/6 — 8:49 — page 1289 — #1285

Index

Namen .................................................................................. 134

optionale ............................................................................. 310

Parameter ........................................................................... 138

Rückgabewert .................................................................. 129

Rückgabewert ignorieren .......................................... 131

Standardfunktionen ..................................................... 145

verschachtelte Funktionen ....................................... 135

verzögert ausführen ....................................... 925, 1133

Funktionsabschluss (Closure) ..................................... 154

G

Gültigkeitsebenen

Funktionen ......................................................................... 135

Klassen ................................................................................. 248

Game-Loop (SpriteKit) ..................................................... 838

GameController-Bibliothek ............................ 830, 1269

GameKit-Bibliothek ........................................................ 1242

Ganze Zahlen .......................................................................... 166

Garbage Collector ................................................................ 282

Gatekeeper ............................................................................... 965

GCController-Klasse ............................................. 830, 1269

Generalisierung .................................................................... 297

Generated Interface ........................................................... 972

Generics ..................................................................................... 299

Array-Beispiel ................................................................... 216

Extensions .......................................................................... 324

Protokolle ........................................................................... 312

Type Constraints ............................................................ 302

Gesture Recognizer ............................................................ 725

Long Press .......................................................... 1062, 1064

Tap ....................................................................................... 1118

tvOS ........................................................................................ 567

get-Methode (Vapor) ....................................................... 1008

get-Schlüsselwort ............................................. 96, 259, 279

getifaddrs-Funktion ........................................................... 365

GIMP (Parallax-Icons) ....................................................... 942

Git ....................................................................................... 973, 996

givenName-Eigenschaft .................................................. 903

GKGridGraph-Klasse ...................................................... 1242

GKInspectable-Attribut .................................................... 364

Globale Funktionen ........................................................... 145

Globale Queues ..................................................................... 923

Gomoku .................................................................................. 1127

GPS-Funktionen ................................................................... 671

Grafikprogrammierung ................................................... 687

Drag&Drop (UIBezierPath) .................................... 733

in einer MapView (MK-Methoden) ...................... 680

Hockey-Spieler zeichnen ............................................ 541

Kompass-Steuerelement ............................................ 694

Kreise zeichnen (UIBezierPath) .............................. 720

Objekt ausschneiden ................................................. 1253

Steuerelement zur Richtungsanzeige ............ 1086

Grand Central Dispatch (GCD) .................................... 919

gravity-Eigenschaft .............. 828, 841, 855, 858, 1269

group-Methode (SpriteKit-Aktionen) ..................... 835

groupingSeparator-Eigenschaft .............................. 1115

Grundrechenarten ................................................................ 73

guard-Schlüsselwort ............................................... 110, 349

Gyroskop ................................................................................... 825

gyroUpdateInterval-Eigenschaft ............................... 827

H

Half-Open-Range-Operator ............................................. 80

Hash-Code (Vapor) ........................................................... 1035

Hashable-Protokoll .................................................. 227, 316

hasItemsConforming-Methode ................................. 748

hasPrefix-Methode ............................................................. 185

hasSuffix-Methode ................................................ 185, 1191

Haversine-Formel ............................................................. 1096

Header-Code erzeugen .................................................... 972

height-Eigenschaft ............................................................. 719

heightForRowAt-Parameter .......................................... 644

heightOfRow-Parameter ................................................. 657

Heimatverzeichnis ................................................ 587, 1254

HelloWorld

Animationen ..................................................................... 706

iCloud .................................................................................... 882

iOS-App ................................................................................. 374

iOS-Appmit Popup ........................................................ 493

Linux ...................................................................................... 988

macOS-Programm ........................................................ 507

MapView/GPS .................................................................. 671

Package Manager .......................................................... 993

Playground ........................................................................... 21

Script ......................................................................................... 38

Terminal App ....................................................................... 31

Vapor (Server-side Swift) ............................................ 996

Hexadezimale Zahlen ....................................................... 166

Hide-Bars-On-Swipe-Option ........................................ 645

HIG (Human Interface Guidelines) ............... 938, 942

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

Highscore speichern (Asteroids-Spiel) ................ 1272

Hintergrund-App ...................................................... 677, 763

Hintergrundfarbe von Fenster (macOS) ............... 888

Homebrew-Paketmanager ................................. 968, 995

horizontalAlignmentMode-Eigenschaft .............. 818

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

HTTP-Requests ................................................................... 1000

HTTPS (Vapor) ..................................................................... 1036

HTTPS-Probleme mit NSURL ....................................... 602

Human Interface Guidelines ............................ 938, 942

1289

Page 51: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1290 — #1286

Index

I

IBAction-Attribut ...................................................... 364, 383

IBDesignable-Attribut ............................................ 364, 701

IBInspectable-Attribut ........................................... 364, 701

IBOutlet-Attribut ....................................................... 364, 383

iCloud .......................................................................................... 875

iCloud Drive ....................................................................... 877

iCloud-ID ermitteln ....................................................... 903

Key/Value-Speicher ....................................................... 881

Key/Value-Speicher (To-do-App) ......................... 1070

Icon ............................................................................................ 1165

App .......................................................................................... 938

iTunes Connect ................................................................ 961

Resizer ................................................................................ 1165

icon-Eigenschaft (NSAlert) ............................................ 535

IconSize-Struktur (Icon-Resizer-Beispiel) ......... 1171

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

ID-Nummer (CloudKit) .................................................... 891

Identifier-Klasse (Vapor) .............................................. 1031

if-available-Test ..................................................................... 115

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

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

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

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

let (Optionals) ............................................. 102, 108, 740

image-Eigenschaft ......................................... 659, 705, 735

Image-Picker-Controller ....................................... 781, 788

Image-View-Steuerelement ............................. 642, 1104

imageComponentsProvider-

Eigenschaft ....................................................... 735, 1185

imageLiteral-Schlüsselwort .......................................... 811

Images.xcassets-Datei ...................................................... 455

UIImage-Objekt erzeugen ......................................... 639

imageView-Eigenschaft (UITableCell) .................... 636

Implicitly Unwrapped Optionals ............................... 101

import-Anweisung ............................................................. 359

in-Schlüsselwort (Closures) ........................................... 154

include-Anweisung (Bridging-Datei) ...................... 366

Index-Datentyp ..................................................................... 188

Zeichenketten ................................................................... 193

index-Methode ...................................................................... 219

Zeichenketten ........................................................ 193, 194

IndexPath-Klasse ................................................................. 647

indexPath-Methode ............................................. 647, 1091

indexPathForCell-Methode ........................................... 647

indices-Eigenschaft ............................................................ 223

indirect-Schlüsselwort ..................................................... 253

infinity-Eigenschaft .............................................................. 74

infix-Schlüsselwort ............................................................... 88

Info.plist-Datei ...................................................................... 940

ändern (App Transport Security) .......................... 626

Privacy-Einträge (Standortzugriff) ...................... 673

Privacy-Einträge (Video-Zugriff) ........................... 781

Init-Funktion ............................................................... 244, 266

Designated versus Convenience ............................ 268

Enumeration ..................................................................... 250

Fehler auslösen (throw) .............................................. 347

nil zurückgeben ............................................................... 269

Overloading ...................................................................... 268

Redundanz vermeiden ................................................ 296

UIViewController ........................................................... 412

Vererbung ........................................................................... 293

initRnd-Funktion ................................................................. 847

Inkrement-Operator ............................................................. 74

inout-Schlüsselwort ........................................................... 142

insert-Methode .......................................................... 213, 230

insertContentOf-Methode ............................................. 213

insertRows-Methode ...................................................... 1066

insertText-Methode ........................................................... 540

insertXxx-Methoden (NSEvent) ................................. 540

instantiateController-Methode .................................. 525

instantiateViewController-Methode ...................... 499

Instanzmethoden ................................................................ 271

Int-Datentyp ........................................................................... 166

Int-Init-Funktion .................................................................. 199

Interface ..................................................................................... 304

Interface Builder .................................................................. 383

Interface Orientation ........................................................ 825

internal-Schlüsselwort ..................................................... 247

Internationalization (i18n) ............................................ 947

Internet-Radio abspielen ................................................ 769

Interpolation (Strings) ...................................................... 197

interpretKeyEvents-Methode ...................................... 540

intersect-Methode .............................................................. 738

intersects-Methode ................................................. 173, 840

invalidate-Methode ............................................................ 926

iOS

DeviceSupport-Verzeichnis ...................................... 980

Grundlagen ........................................................................ 403

HelloWorld ........................................................................ 374

Simulator ................................................................. 378, 675

Versionsnummer ermitteln ...................................... 559

IP-Adresse ermitteln .......................................................... 365

iPhone X

Safe Area Layout Guides ............................................ 432

SpriteKit ............................................................................... 809

iRnd-Funktion ....................................................................... 847

is-Operator ............................................................ 78, 298, 331

isBezeled-Eigenschaft ....................................................... 658

isDeletableFile-Methode ................................................. 591

isDynamic-Eigenschaft .................................................... 857

SpriteKit ............................................................................... 844

isEditable-Eigenschaft ...................................................... 658

isEmpty-Eigenschaft ............................................... 211, 229

isEnabled-Eigenschaft ................................................... 1063

isMultipleTouchEnabled-Eigenschaft ......... 713, 819

1290

“buch” — 2017/10/6 — 8:49 — page 1291 — #1287

Index

iso8601-Konstante (JSONEncoder) ........................... 615

isPaused-Eigenschaft ........................................................ 837

isReadableFile-Methode .................................................. 591

isResting-Eigenschaft ....................................................... 857

isSourceTypeAvailable-Methode ............................... 781

isUserInteractionEnabled-Eigenschaft .................. 745

isViewLoaded-Methode ................................................... 481

isWritableFile-Methode ................................................... 591

itemsForAddingTo-Parameter .................................... 753

itemsForBeginning-Parameter ........................ 746, 753

iTunes Connect ..................................................................... 956

J

Ja/Nein-Dialog ....................................................................... 503

joined-Methode ......................................................... 192, 224

JoinedSequence-Struktur ............................................... 225

JSON .............................................................................................. 614

Codable-Protokoll .......................................................... 614

Vapor .................................................................................. 1011

JSONDecoder-Klasse ............................................ 616, 1081

NYT-Beispiel .................................................................... 1046

JSONEncoder-Klasse ............................................. 615, 1081

K

Kürzester-Pfad-Problem ............................................... 1242

Kamera wechseln ................................................................ 795

Kanonenkugel (Beispiel) ................................................. 858

Key/Value-Paare ................................................................... 226

iCloud ......................................................................... 876, 881

iCloud (To-do-App) ..................................................... 1070

keyCode-Eigenschaft ......................................................... 540

keyDown-Methode ............................................................. 539

KeyedDecodingContainer .............................................. 621

KeyPath-Ausdrücke ............................................................ 333

keys-Eigenschaft .................................................................. 229

keyUp-Methode .................................................................... 539

Kitura-Framework ............................................................... 986

Klassen ....................................................................................... 242

verschachteln ................................................................... 249

Kollisionserkennung ......................................................... 840

Luftballone ......................................................................... 845

Pac-Man ............................................................................ 1245

Kommandoparameter ........................................................ 35

Kommentare ............................................................................. 43

MARK .................................................................................... 733

Playground ........................................................................... 28

Kompass ......................................................................... 671, 683

Kalibrierung ...................................................................... 684

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

Konstanten ................................................................................. 94

Eigenschaften ................................................................... 255

Eulersche Zahl .................................................................. 148

Pi .............................................................................................. 148

Kontextmenü ......................................................................... 550

Koordinatensystem ............................................................ 718

Kreis zeichnen ......................................................... 722, 1253

Kreiselkompass ..................................................................... 825

Kreisteilungszahl ................................................................. 148

kUTTypeImage-Konstante ............................................. 748

kUTTypeMovie-Konstante ............................................ 781

L

Label

macOS ................................................................................... 512

SpriteKit ............................................................................... 818

Sprunglabel (break/continue) ................................ 120

Lambda-Ausdruck ............................................................... 154

Landscape-Modus ............................................................... 825

last-Eigenschaft ............................................... 193, 211, 218

lastPathComponent-Eigenschaft .............................. 583

Launch Image (tvOS) ......................................................... 946

launch-Methode ................................................................... 369

launchApplication-Methode ........................................ 621

launchPath-Eigenschaft .................................................. 369

LaunchScreen-Datei ........................................................... 939

Lautstärke ändern ............................................................... 761

Layer ............................................................................................. 778

layer-Eigenschaft .................................................... 888, 1150

Layered Image File Format ............................................ 942

Layout Guides ........................................................................ 432

layoutFrame-Eigenschaft .................................. 809, 1197

layoutMargins-Eigenschaft ........................................... 809

Layoutregeln ........................................................................... 417

Hoch- und Querformat ............................................... 445

je nach Device variieren ............................................. 440

Varianten ............................................................................ 440

Lazy Properties ..................................................................... 255

Beispiel ................................................................................. 605

lazy-Eigenschaft ................................................................... 215

LazyMapCollection-Datentyp ..................................... 229

LCR-Datei .................................................................................. 942

Lebenszyklus

App .......................................................................................... 414

View-Controller ............................................................... 410

Left-Shift (bitweises Rechnen) ....................................... 75

leftBarButtonItem-Eigenschaft .................................. 492

leftItemsSupplementBackButton-Eigenschaft 492

let-Schlüsselwort .................................................................... 94

in switch-Konstruktionen ......................................... 114

mit if ............................................................................ 108, 740

mit switch-case ............................................................... 252

mit while .............................................................................. 119

letters-Eigenschaft .............................................................. 187

limit-Methode (Vapor/Fluent) .................................. 1021

line-Methode .......................................................................... 691

linearDamping-Eigenschaft ............................ 857, 1201

1291

Page 52: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1292 — #1288

Index

lineWidth-Eigenschaft ..................................................... 722

SpriteKit ............................................................................... 816

Listen-Steuerelement (iOS) ........................................... 629

veränderliche Listen ..................................................... 647

Picker-View ..................................................................... 1119

LiteralConvertible-Protokolle ...................................... 320

loadObjects-Methode ............................................. 748, 754

loadRequest-Methode ........................................ 622, 1052

locale-Eigenschaft .................................................... 199, 203

Locale-Struktur .......................................................... 199, 203

im Playground ................................................................. 198

Localization (l10n) ............................................................... 947

Localization native development region ............. 948

localizedCaseInsensitiveCompare ........................... 186

localizedDescription-Eigenschaft ............................. 356

Location Manager .................................................... 678, 679

Kompass .............................................................................. 683

teilen ................................................................................... 1082

location-Methode ................................................................ 712

locationInView-Methode ............................................. 1153

locationInWindow-Eigenschaft ................................. 720

locationManager-Methode ................................ 680, 683

locationManagerShouldDisplayHeading-

Calibration-Methode ............................................... 684

lockFocus-Methode ......................................................... 1173

lockForConfiguration-Methode ................................. 800

logische Operatoren ............................................................. 80

Lottozahlen .............................................................................. 231

Benchmarks ...................................................................... 235

macOS-Beispiel ................................................................ 509

lowercased-Methode ......................................................... 186

LSR-Datei ................................................................................... 942

M

Main Queue ............................................................................. 923

main-Methode (Dispatch Queue) ............................. 923

makeImage-Funktion .................................................... 1174

makeJSON-Methode (Vapor) ..................................... 1012

makeKeyAndOrderFront-Eigenschaft ................... 553

makeQuery-Methode (Vapor/Fluent) .................. 1021

map .................................................................................................. 81

Map Kit (MK) ........................................................................... 671

Framework ......................................................................... 675

map-Methode

rethrows-Beispiele ......................................................... 350

Sets .......................................................................................... 231

mapOverlay-Methode ...................................................... 680

mapValues-Methode (Dictionaries) ........................ 230

mapView-Methode ............................................................. 682

MapView-Steuerelement ................................................ 671

MariaDB (Vapor) ................................................................ 1028

MARK-Kommentar ..................................................... 45, 733

Markdown-Kommentare .......................................... 28, 43

mass-Eigenschaft ................................................................. 857

Master-Ansicht zuerst anzeigen ................................ 490

Mathematische Funktionen ......................................... 148

Maus ............................................................................................ 718

max-Eigenschaft .................................................................. 166

max-Funktion ........................................................................ 147

maximumFractionDigits-Eigenschaft ..... 199, 1115

maxPoint-Eigenschaft ..................................................... 175

maxX/maxY-Eigenschaft ................................................ 173

Maze-Klasse (Pac-Man-Spiel) ..................................... 1220

MediaPlayer-Bibliothek ........................................ 758, 761

mediaTypes-Eigenschaft ................................................ 781

Mehrblättrige Dialoge ...................................................... 526

Mehrdimensionale Arrays ............................................. 216

erzeugen ........................................................................... 1132

Mehrfachvererbung ........................................................... 288

Menüs ......................................................................................... 543

deaktivieren ....................................................................... 552

Kontextmenüs .................................................................. 550

menu-Eigenschaft

NSApplication .................................................................. 550

NSView .................................................................................. 550

Menubar-App ......................................................................... 552

Message-Box ........................................................................... 533

messageText-Eigenschaft ............................................... 534

metadataOutput-Methode ............................................ 802

Metal ............................................................................................ 803

Metatypen ................................................................................ 334

Methoden ................................................................................. 271

Aufruf mit Optional Chaining ................................ 103

MutatingMethods ........................................................ 273

optionale ............................................................................. 310

Signatur ............................................................................... 276

statische Methoden ...................................................... 275

Typmethoden ................................................................... 275

middlePoint-Eigenschaft ............................................... 175

midX/midY-Eigenschaft .................................................. 173

Mikrofon (Audio-Aufnahmen) .................................... 772

min-Eigenschaft ................................................................... 166

min-Funktion ......................................................................... 147

minimumFractionDigits-Eigenschaft ...... 199, 1115

minimumPressDuration-Eigenschaft ................ 1062

minPoint-Eigenschaft ...................................................... 175

minX/minY-Eigenschaft ................................................. 173

Mirror-Datentyp .................................................................. 332

MKMapView-Klasse ........................................................... 671

MKMapViewDelegate-Protokoll ................................ 678

MKPolyline-Klasse .............................................................. 680

MKPolylineRenderer ......................................................... 682

MobileCoreServices-Bibliothek .................................. 781

Model-Protokoll (Vapor/Fluent) .............................. 1017

modifierFlags-Eigenschaft .................................. 540, 720

Modifizier ................................................................................. 248

1292

“buch” — 2017/10/6 — 8:49 — page 1293 — #1289

Index

Module ............................................................................. 246, 359

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

motion-Eigenschaft ........................................................... 830

mouseDown-Methode ............................ 718, 724, 1185

mouseDragged-Methode ....................... 718, 735, 1185

mouseEntered-Methode ................................................. 718

mouseExited-Methode .................................................... 718

mouseUp-Methode ............................................................ 718

move-Methode ...................................................................... 691

SpriteKit ............................................................................... 832

moveItem-Methode ........................................................... 593

moveRowAt-Parameter ................................................ 1067

moveXxx-Methoden (NSEvent) ................................. 540

Movie-Trailer-Beispiel ...................................................... 661

MP3/MP4-Format ................................................................ 759

MPMedia-Konstanten ...................................................... 765

MPNowPlayingInfoCenter-Klasse ............................ 764

MPRemoteCommandCenter-Klasse ....................... 764

MPVolumeView-Klasse .................................................... 761

Multi-Threading ................................................................... 919

Multiple-Touch-Option ................................................... 713

mutating-Schlüsselwort ................................................. 273

MySQL (Vapor) .................................................................... 1026

mysql.json-Datei (Vapor) ............................................. 1026

N

Nachkommaanteil ........................................................... 1215

Nachrichten anzeigen ...................................................... 533

Namenlose Parameter ..................................................... 139

Navigation-Controller ...................................................... 471

Navigation per Code .................................................... 474

Beschriftung ändern ..................................................... 474

Detailansicht einer Liste ............................................ 644

mit Split-View-Controller ................................ 485, 491

mit Tab-Bar-Controller ............................................... 479

weißer Streifen .............................................................. 1049

navigationItem-Eigenschaft ......................................... 492

Nebenläufige Programmierung ................................ 919

Nested Functions ................................................................. 135

Nested Generics .................................................................... 300

Never-Schlüsselwort .......................................................... 137

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

nextCommand-Eigenschaft ......................................... 766

nextFocusedItem-Eigenschaft .................................... 571

NextStep ....................................................................................... 27

nginx-Webserver (Vapor) ............................................. 1038

NIB-Datei ................................................................................... 412

Nil ..................................................................................................... 84

Nil-Coalescing-Operator ............................................... 84

nil-Schlüsselwort ............................................................... 99

nil-Test .................................................................................. 102

noescape-Attribut ............................................................... 162

nonConformingFloatEncodingStrategy-

Eigenschaft .................................................................... 615

noreturn-Attribut ................................................................ 137

Notification Center .......................................................... 1083

AVPlayer .............................................................................. 769

Layout ändern .................................................................. 447

NotificationCenter-Klasse ........................................... 1084

notify-Methode ..................................................................... 924

nowPlayingInfo-Eigenschaft ........................................ 765

npm-Kommando ................................................................. 968

NSAlert-Klasse ....................................................................... 534

NSApplication-Klasse .......................................... 517, 1179

NSAppTransportSecurity-Eintrag ............................. 602

NSBezierPath-Klasse ................................. 722, 733, 1253

NSBitmampImageRep-Klasse ................................... 1254

NSButton-Klasse ............................................................... 1189

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

NSCameraUsageDescription-Key ................... 783, 788

NSCocoaErrorDomain ...................................................... 356

NSCoding-Protokoll ........................................................... 412

NSColorPanel-Klasse ......................................................... 537

NSColorWell-Steuerelement ......................................... 537

NSData-Klasse ........................................................................ 201

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

NSDictionary-Klasse .......................................................... 530

NSDraggingDestination-Protokoll ........................... 729

NSDraggingImageComponent-Klasse ................... 735

NSDraggingInfo-Klasse .................................................... 740

NSDraggingItem-Klasse .......................... 730, 735, 1185

NSDraggingSource-Protokoll ......................... 735, 1185

NSError-Klasse ....................................................................... 355

NSEvent-Klasse

Maus ...................................................................................... 720

Tastatur ............................................................................... 540

NSEventModifierFlags-Struktur ................................ 720

NSException-Klasse ........................................................... 349

NSFileManager-Klasse ................................................... 1190

NSFilenamesPboardType-Konstante ...................... 740

NSFont-Klasse ........................................................................ 532

NSFontManager-Klasse ........................................ 532, 536

NSFontPanel-Klasse ........................................................... 536

NSGestureRecognizer-Klasse ....................................... 725

NSGradient-Klasse ........................................................... 1253

NSHomeDirectory-Funktion .......................... 587, 1254

NSImage-Klasse ...................................................... 659, 1173

Assets verwenden .......................................................... 585

NSImageView-Klasse ......................................................... 733

NSImageView-Steuerelement ..................................... 659

NSItemProvider-Klasse .............................. 743, 746, 753

NSItemProviderReading-Protokoll .......................... 748

NSLayoutConstraint-Klasse .......................................... 434

NSLocale-Klasse .................................................................... 186

NSLocalizedString-Klasse ............................................... 954

1293

Page 53: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1294 — #1290

Index

NSMakeRange-Funktion ................................................. 189

NSManaged-Attribut ......................................................... 365

NSMenu-Klasse ..................................................................... 545

NSMenuItem-Klasse .......................................................... 545

NSMenuValidation-Protokoll ...................................... 550

NSMicrophoneUsageDescription-Key ................... 783

NSMutableDictionary-Klasse .................................... 1111

NSNumber-Klasse ............................................................... 170

Beispiel Dateigröße ....................................................... 591

NSNumberFormatter-Klasse .......................... 657, 1117

NSObject-Klasse ......................................................... 288, 656

description-Eigenschaft ............................................. 315

NSObject-Protokoll .......................................................... 1083

NSObjectProtocol-Protokoll ........................... 288, 1083

NSOpenPanel-Klasse ......................................................... 535

Datei auswählen .......................................................... 1188

Verzeichnisauswahl ................................................... 1179

NSPasteBoard-Klasse ......................................................... 740

NSPasteboard.PasteboardType-Struktur ............. 732

NSPhotoLibraryUsageDescription-Key ...... 781, 788

NSPoint-Klasse ...................................................................... 735

NSPoint-Struktur ................................................................. 719

NSPredicate-Klasse .................................................. 900, 901

NSProgressIndicator-Steuerelement ...................... 929

NSRect-Klasse ........................................................................ 735

NSRect-Struktur ................................................................... 719

NSRegularExpression-Klasse ....................................... 189

NSResponder-Klasse ............................................... 538, 546

NSSavePanel-Klasse ........................................................... 535

NSSize-Klasse ......................................................................... 735

NSSize-Struktur .................................................................... 719

NSSortDescriptor-Klasse ..................................... 659, 902

NSSplitter-Klasse ................................................................. 529

NSSplitView-Steuerelement ...................................... 1167

Delegation ....................................................................... 1181

NSSplitViewController-Klasse .................................. 1168

NSSplitViewDelegate-Protokoll ............................... 1181

NSStatusBar-Klasse ............................................................ 553

NSString-Datentyp ............................................................. 179

NSString-Klasse .................................................................... 753

NSTableView-Steuerelement ....................................... 650

NSTableViewDataSource-Protokoll .......................... 652

Icon-Resizer-Beispiel ................................................. 1182

NSTableViewDelegate-Protokoll .................. 652, 1184

NSTabViewController-Steuerelement .................... 526

NSTemporaryDirectory-Funktion .............. 588, 1190

NSTextField-Steuerelement ............................... 512, 658

NSUbiquitousKeyValueStore-Klasse ....................... 883

NSURL-Klasse ......................................................................... 602

NSURLConnection-Klasse .............................................. 605

NSUUID-Klasse ..................................................................... 588

NSView-Klasse ............................................................. 509, 657

NSViewController-Klasse ................................................ 509

NSWindow-Klasse .................................................... 508, 512

NSWindowController-Klasse ....................................... 508

NSWorkspace-Klasse ............................................ 621, 1179

NSxxx-Klassennamen ......................................................... 27

null-Schlüsselwort ................................................................. 99

NumberFormatter-Klasse ..................... 199, 200, 1115

numberFromString-Methode ..................................... 200

numberOfComponents-Methode ......................... 1121

numberOfLoops-Eigenschaft ...................................... 760

numberOfMatches-Methode ....................................... 189

numberOfRowsInComponent-Parameter ....... 1121

numberOfRowsInSection-Parameter .................... 632

numberOfRowsInTableView-Methode ................. 652

numberOfSectionsInTableView-Methode .......... 632

numberStyle-Eigenschaft .............................................. 199

O

objc-Attribut ................................................................. 311, 364

ObjCBool-Typ ......................................................................... 591

Object-relational Mapping (ORM) ......................... 1017

objectForKey-Methode .................................................. 1111

objectValueForTableColumn-Methode ................. 652

Objektorientierte Programmierung ....................... 241

Observer (Eigenschaften) ............................................... 257

Observer (Notification Manager) ........................... 1085

Öffentliche Datenbank (CloudKit) ........................... 889

Oktale Zahlen ......................................................................... 166

on-Eigenschaft ...................................................................... 710

open-Methode ............................................................ 621, 622

open-Schlüsselwort ............................................................ 247

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

Assoziativität ...................................................................... 86

eigener Exponential-Operator .................................. 89

eigener Operatoren für komplexe Zahlen .......... 87

eigener Vergleichsoperator ......................................... 88

eigener Vergleichsoperator für Vektoren ......... 276

Operatoren für CGPoint und CGVector ............. 174

Priorität .................................................................................. 86

selbst definieren ................................................................. 87

selbst definieren (Beispiele) ........................... 174, 198

Optional Chaining ...................................................... 85, 102

Optional Try ............................................................................ 343

optional-Schlüsselwort .................................................... 310

Optionale Funktionen/Methoden ........................... 310

Optionale Parameter ......................................................... 144

Optionale Protokollregeln ............................................. 310

Optionals ............................................................................. 84, 99

als Rückgabewert von Funktionen ...................... 130

Codable-Protokoll .......................................................... 619

doppelte Optionals ....................................................... 343

if-let-Kombination .............................................. 108, 740

in Kombination mit try .............................................. 343

Init-Funktion ..................................................................... 269

1294

“buch” — 2017/10/6 — 8:49 — page 1295 — #1291

Index

OptionSet-Protokoll ........................................................... 231

Beispiel ................................................................................. 720

orderFrontFontPanel-Methode .................................. 536

orderOut-Methode ............................................................. 554

orientation-Eigenschaft .................................................. 447

origin-Eigenschaft .............................................................. 719

os-Test ......................................................................................... 116

Outlets ............................................................................. 382, 405

Collections .......................................................................... 386

macOS ................................................................................... 515

umbenennen ..................................................................... 386

outputFormatting-Eigenschaft .................................. 615

Overloading

Funktionen ......................................................................... 134

Init-Funktion ..................................................................... 268

override-Schlüsselwort .................................................... 289

Computed Properties ................................................... 291

Property Observers ....................................................... 290

View-Controller ............................................................... 414

P

Package Manager ...................................................... 363, 993

Palindromtest ........................................................................ 187

Parallax-Effekt ........................................................................ 941

Parameter ................................................................................. 138

autoclosures ...................................................................... 157

benannte Parameter .................................................... 128

benannte, in Init-Funktionen .................................. 267

benannte, in Protokollen ........................................... 305

Inout-Parameter ............................................................. 142

noescape ............................................................................. 162

optionale Parameter .................................................... 144

unbenannte Parameter .............................................. 139

variable Anzahl ............................................................... 144

von Terminal-Apps ........................................................... 35

zweinamige Parameter .............................................. 140

Parsen

Datum und Uhrzeit ....................................................... 204

Zahlen ................................................................................... 200

PartialRangeThrough-Struktur ..................................... 80

PartialRangeUpTo-Struktur ............................................. 80

Partikel-Emitter .................................................................... 872

pasteConfiguration-Eigenschaft ................................ 745

patch-Methode (Vapor) ................................................. 1008

path-Eigenschaft .................................................................. 583

path-Methode (Bundle-Datei) ..................................... 584

pathFinder-Methode ...................................................... 1243

Pattern-Zeichen ....................................................................... 72

pause-Methode ..................................................................... 769

pauseCommand-Eigenschaft ...................................... 766

PDF417-Barcode .................................................................... 800

Perfect-Framework ............................................................. 986

perform-Funktion ............................................................... 925

perform-Methode ............................................................... 900

performDragOperation-Methode .... 730, 741, 1187

performDrop-Parameter ................................................ 748

performDropWith-Parameter ..................................... 754

performSegue-Methode ....................................... 469, 525

Navigation-Controller ................................................. 474

permittedArrowDirections-Eigenschaft .............. 498

Photo Library ......................................................................... 788

photoOutput-Methode .................................................... 796

physicalMemory-Eigenschaft ..................................... 559

physicsBody-Eigenschaft ................................................ 842

physicsWorld-Eigenschaft ............................................. 841

Physik (SpriteKit) ................................................................. 852

Pi-Konstante ........................................................................... 148

Picker-View-Steuerelement .......................... 1106, 1119

Rollover ............................................................................. 1121

pickerView-Methode ...................................................... 1121

picturesDirectory-Konstante ....................................... 587

Pipe-Klasse ............................................................................... 369

Pixel versus Punkt .............................................................. 417

Platformspezifischer Code ............................................ 116

play-Methode ......................................................................... 759

playCommand-Eigenschaft .......................................... 766

playerViewDidBecomeReady-Methode ................ 787

Playgrounds ............................................................................... 22

auf dem iPad ........................................................................ 39

Locale-Einstellungen .................................................... 199

playSoundFileNamed-Methode (SpriteKit) ........ 834

PLIST-Format .......................................................................... 577

PNG-Datei speichern

NSBitmapImageRep .................................................. 1252

CGImage ........................................................................... 1175

Polygon (SpriteKit) ............................................................. 860

Polygon zeichnen ............................................................. 1253

Polymorphie ........................................................................... 297

Popover-Segue ....................................................................... 493

popToRootViewController-Methode ...................... 474

popToViewController-Methode ................................. 474

Popups ........................................................................................ 493

5-Gewinnt-App .............................................................. 1160

Größe einstellen .............................................................. 495

per Code anzeigen ......................................................... 499

Richtung festlegen ......................................................... 497

popViewController-Methode ......................... 474, 1099

position-Eigenschaft ......................................................... 810

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

post-Methode (Vapor) .................................................... 1008

postfix-Schlüsselwort .......................................................... 88

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

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

Precedence-Gruppen ........................................................... 86

precedence-Schlüsselwort ............................................ 88

precedencegroup-Schlüsselwort .............................. 89

1295

Page 54: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1296 — #1292

Index

preferredBarTintColor-Eigenschaft ......................... 626

preferredContentSize-Eigenschaft ........................... 496

preferredControlTintColor-Eigenschaft ............... 626

preferredFocusEnvironments-

Eigenschaft ......................................... 571, 1261, 1277

prefersStatusBarHidden-Eigenschaft ....... 812, 1196

prefix-Methode ..................................................................... 218

prefix-Schlüsselwort ............................................................ 88

prepare-Methode ...................................................... 467, 522

Detailansicht bei Table-View ................................... 647

Fluent .................................................................................. 1018

Popups auf dem iPhone ............................................. 495

prepareToPlay-Methode ................................................. 759

prepartions-Eigenschaft (Fluent) ........................... 1024

preprareForDragOperation-Methode .................... 730

present-Methode ........................................... 499, 504, 625

für Alert-Dialoge ............................................................. 504

Presentation-Controller .................................................. 461

presentedViewController-Eigenschaft .................. 417

Presenting Segues ............................................................... 521

presentingViewController-Eigenschaft ................ 497

presentScene-Klasse .......................................................... 868

presses-Methoden .............................................................. 565

pressesBegan-Methode ................................................ 1260

prettyPrinted-Konstante (JSONEncoder) ............. 615

previousCommand-Eigenschaft ................................ 766

previousLocation-Methode .......................................... 820

previouslyFocusedItem-Eigenschaft ...................... 571

print-Funktion ....................................................................... 147

CustomStringConvertible-Protokoll ................... 314

Printable-Protokoll ............................................................. 314

printf-Syntax .......................................................................... 197

Priorität von Operatoren .................................................. 86

Privacy-Keys

Camera Usage ....................................................... 783, 788

Location Usage ................................................................ 673

Microphone Usage ............................................. 773, 783

Photo Library ......................................................... 781, 788

Private Datenbank (CloudKit) ..................................... 889

private set für Read-Only-Eigenschaften ............. 261

private-Schlüsselwort ....................................................... 247

privateCloudDatabase-Eigenschaft ......................... 896

Process-Klasse ....................................................................... 369

ProcessInfo-Klasse .............................................................. 559

Production Environment (CloudKit) ...................... 891

Profil-Dateien (iOS/tvOS) ............................................... 982

Programm

beenden (iOS) .................................................................... 414

beenden (macOS) ........................................................... 517

signieren .............................................................................. 964

weitergeben ....................................................................... 964

Projekte umbenennen ..................................................... 978

prompt-Eigenschaft ........................................................... 472

Properties ................................................................................. 254

Computed Properties ........................................ 259, 291

Extensions .......................................................................... 327

Lazy Properties ................................................................ 255

Property Observers ....... 257, 290, 694, 1062, 1114

Property Observers (Beispiel) ............................... 1153

Read-Only Computed Property ............................. 261

Static Properties .............................................................. 259

Type Properties ................................................................ 259

Property Lists

propertyList-Methode ................................................. 740

PropertyListDecoder-Klasse .................................... 614

PropertyListEncoder-Klasse ..................................... 614

User-Defaults ...................................................... 577, 1061

protocol-Schlüsselwort ......................................... 306, 334

Protokolle ................................................................................. 304

erweitern ............................................................................. 328

Extensions .......................................................................... 323

für generische Typen .................................................... 312

nur für Klassen ................................................................. 307

optionale Regeln ............................................................ 310

Protocol Composition ................................................. 308

Standardprotokolle ...................................................... 314

Vererbung ........................................................................... 307

Prototypzellen ....................................................................... 635

Collection-View ............................................................... 665

Provisioning Profile ................................................ 400, 956

Proxy-Konfiguration (Vapor) .................................... 1038

Pseudo-3D ................................................................................ 803

public-Schlüsselwort ......................................................... 247

publicCloudDatabase-Eigenschaft ........................... 896

Pull to Refresh (Table-View) .......................................... 648

Punkt versus Pixel .............................................................. 417

Pyramide (Beispiel) ............................................................ 858

Q

qos-Parameter ....................................................................... 922

QR-Codes erkennen ........................................................... 799

Quality of Service (async-Methode) ............. 922, 924

Query-Klasse (Vapor/Fluent) ..................................... 1021

Queues (asynchrone Programmierung) .............. 923

R

Rückgabewerte (Funktionen) ...................................... 129

Radio-Stream abspielen .................................................. 769

radix-Parameter ................................................................... 166

raise-Methode ........................................................................ 349

RAM-Größe ermitteln ...................................................... 559

Rand eines Steuerelements .......................................... 413

Random Numbers .............................................................. 169

range-Methode (Zeichenketten) ................................ 188

Range-Operatoren ................................................................. 80

1296

“buch” — 2017/10/6 — 8:49 — page 1297 — #1293

Index

rangeOfCharacter-Methode .......................................... 187

rate-Eigenschaft .................................................................... 770

rawValue-Eigenschaft ....................................................... 251

Enumerationen .................................................................. 98

Read-Only-Eigenschaft .................................................... 261

readDataToEndOfFile-Methode ................................. 369

readLine-Funktion .............................................................. 147

readObjects-Methode ....................................................... 740

rear-Enumerationswert ................................................... 790

Rear-Kamera ........................................................................... 795

Rechenoperatoren ................................................................. 73

Record speichern (CloudKit) ........................................ 898

Record Zones (CloudKit) ................................................. 891

record-Methode .................................................................... 775

recordID-Eigenschaft ............................................. 891, 899

recordName-Eigenschaft .......................... 891, 899, 903

Records und Record Types (CloudKit) ................... 890

Redraw-Einstellung (contentMode) ........................ 698

reduce-Methode ................................................................... 224

mit inout-Parameter .................................................... 224

Refactoring .............................................................................. 977

Reference Counting ........................................................... 282

ReferenceWritableKeyPath-Klasse ........................... 333

Referenzen (CloudKit) ...................................................... 899

Referenztypen ............................................................... 72, 104

Reflection .................................................................................. 332

Regeln (Auto Layout) ......................................................... 417

register-Methode ...................................................... 530, 631

registerForDraggedTypes-Methode 729, 732, 1178

Reguläre Ausdrücke ........................................................... 189

Rekursion .................................................................................. 136

Enumerationen ............................................................... 253

indirekte Enumeration ............................................... 253

Verzeichnisbaum durchlaufen ............................... 592

Relationen (Vapor/Fluent) .......................................... 1021

reloadData-Methode .................................... 647, 660, 755

reloadRows-Methode ........................................................ 647

reloadRowsAtIndexPaths-Methode ...................... 1067

remove-Methode ...................................................... 213, 230

removeAllActions-Methode ......................................... 837

removeFirst-Methode ....................................................... 213

removeFromParent ............................................................ 836

removeFromSubview-Methode .............................. 1152

removeItem-Methode ...................................................... 593

removeItemAtPath-Methode ................................... 1190

removeLast-Methode ........................................................ 213

removeObserver-Methode ......................................... 1086

removeSubrange-Methode ........................................... 213

Renju ......................................................................................... 1127

repeat-Methode (SpriteKit-Aktionen) .................... 836

repeat-while-Schleife ........................................................ 119

repeatForever-Methode (SpriteKit) ............... 834, 836

REPL-Modus ............................................................................... 37

replaceCurrentItem-Methode ..................................... 768

replaceSubrange-Methode ................................. 188, 214

replacingOccurrences-Methode ..................... 188, 659

representedObject-Eigenschaft .................................. 514

Request-Klasse (Vapor) .................................... 1009, 1011

requestAlwaysAuthorization-Methode ...... 672, 679

requestRecordPermission-Methode ....................... 773

requestWhenInUseAuthorization-Methode ..... 672

required-Schlüsselwort ................................................... 295

reserveCapacity-Methode .............................................. 215

resignFirstResponder-Methode ................................. 539

Resistance Priority .............................................................. 438

resizeAspect-Konstante ................................................... 778

Resolve-Layout-Issues-Button .................................... 418

ResourceRepresentable-Protokoll ......................... 1022

Responder

Menüauswahl .................................................................. 546

Responderkette ................................................................ 544

Tastaturereignisse ......................................................... 538

Response-Klasse (Vapor) .............................................. 1009

ResponseRepresentable-Protokoll (Vapor) ...... 1009

Ressourcen ............................................................................... 584

REST-Konzept ......................................................................... 985

restitution-Eigenschaft ...................................... 857, 1201

reStructuredText-Kommentare .................................... 28

Restwert-Operator ................................................................. 73

resume-Methode ................................................................. 604

rethrows-Schlüsselwort ................................................... 350

Retroactive Modeling ....................................................... 322

return-Schlüsselwort ......................................................... 127

Reverse Polish Notation .................................................. 158

reverse-Methode .................................................................. 215

reversed-Methode ............................................................... 187

SpriteKit-Aktionen ......................................................... 836

Richtung zwischen zwei Punkten .......................... 1096

Right-Shift (bitweises Rechnen) .................................... 75

rightMouseDown-Methode .......................................... 718

rightMouseDragged-Methode .................................... 718

rightMouseUp-Methode ................................................. 718

Rollover (Picker-View) .................................................... 1121

Root manifest not found (Vapor) ........................... 1005

Root-View-Controller ............................................. 411, 416

rootViewController-Eigenschaft .......... 411, 416, 488

rotate-Methoden (SpriteKit-Aktionen) .................. 833

rotationRate-Eigenschaft ............................................... 828

round-Funktion .................................................................... 168

Routing (Vapor) .................................................................. 1008

rowHeightForComponent-Parameter ................ 1123

RPN-Rechner ........................................................................... 158

RSS-Datei auswerten ......................................................... 662

Ruby ............................................................................................. 361

run-Methode (SpriteKit) ....................................... 832, 837

runModal-Methode ................................................. 534, 535

1297

Page 55: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1298 — #1294

Index

S

SafariServices-Bibliothek ............................................... 622

Safe Area Layout Guides ....................................... 420, 432

SpriteKit ............................................................................... 809

safeAreaLayoutGuide-Eigenschaft ... 434, 809, 1197

Sandbox

iOS ........................................................................................... 587

macOS ................................................................................... 587

macOS, Icon-Resizer .................................................. 1170

save-Methode

CloudKit ............................................................................... 898

Vapor/Fluent .................................................................. 1021

scale-Methoden (SpriteKit-Aktionen) .................... 833

Scene-Editor ............................................................................ 865

SceneKit ..................................................................................... 803

Schalter (UISwitch-Steuerelement) .......................... 709

Schatzsuche .......................................................................... 1075

scheduledTimer-Methode ............................................. 925

Schlüssel-Wert-Paare ......................................................... 226

Schlüsselwörter als Variablennamen ........................ 94

Schleifen .................................................................................... 117

abbrechen (break) .......................................................... 119

nicht-triviale Schleifen ................................................ 121

Schnittstelle ............................................................................ 304

Schrift auswählen ................................................................ 533

Schriftattribute ändern ................................................... 532

Schwerkraft (SpriteKit) ..................................................... 841

Screenshots (Apple TV) .................................................... 557

scrollPosition-Parameter (Table-View) .................. 634

scrollToRow-Methode ......................................... 647, 1066

scrollXxx-Methoden (NSEvent) .................................. 540

SearchPathDirectory-Enumeration ......................... 587

SearchPathDomainMask-Struktur ........................... 587

seek-Methode (AVPlayer) ................................................ 780

Segues ......................................................................................... 460

Datenübergabe ............................................................... 522

Datenübertragung ........................................................ 465

macOS ................................................................................... 521

per Code initiieren ......................................................... 469

Popover ................................................................................ 493

Unwind ...................................................................... 462, 467

verhindern .......................................................................... 468

vonMenüeinträgen ...................................................... 548

Selected-Image-Eigenschaft ......................................... 479

selectedIndex-Eigenschaft ............................................. 482

selectedRow-Eigenschaft ................................................ 660

selectedViewController-Eigenschaft ....................... 482

selectRow-Eigenschaft .................................................. 1120

selectRow-Methode ............................................................ 634

selectXxx-Methoden (NSEvent) ................................. 540

Selektor .............................................................. 433, 553, 1063

Syntax ....................................................................... 277, 433

self-Schlüsselwort ............................................................... 246

bei Enumerationen .................................................... 1130

in Closures .......................................................................... 157

in MutatingMethods ................................................... 274

Klassentyp .......................................................................... 320

Self-Schlüsselwort ............................................................... 246

Protokolle ................................................................ 307, 316

Selfie-Kamera ......................................................................... 795

sequence-Methode (SpriteKit-Aktionen) ............. 836

Sequence-Protokoll ............................................................ 117

Serielle Queues ..................................................................... 923

Server-APIs-Bibliothek ..................................................... 992

Server-side Swift ................................................................... 985

sessionDidUpdate-Parameter ..................................... 747

Set-Datentyp ........................................................................... 230

Option-Sets ........................................................................ 231

uniqueSet-Methode ...................................................... 330

set-Methode (Key/Value-Speicher) ........................... 883

set-Schlüsselwort .............................................. 96, 259, 279

setAction-Methode (NSColorPanel) ........................ 537

setActive-Methode (AVAudioSession) .................... 773

setCategory-Methode ....................................................... 773

setDataSouce-Methode ................................................... 656

setDelegate-Methode ........................................................ 656

setEditing-Methode .............................................. 648, 1063

setFill-Methode ....................................................... 691, 1086

setLineDash-Methode ...................................................... 692

setNeedsDisplay-Methode ......... 694, 724, 733, 1148

setNeedsFocusUpdate-Methode .................. 571, 1277

setObject-Methode .......................................................... 1111

CloudKit ............................................................................... 898

setRegion-Methode ............................................................ 680

setSelectedFont-Methode .............................................. 536

setStroke-Methode ................................................ 691, 1086

setTarget-Methode (NSColorPanel) ......................... 537

setTitle-Methode ............................................................... 1063

setVolume-Methode .......................................................... 761

SFSafariViewController-Klasse ................................... 622

Shapes (SpriteKit) ................................................................ 816

Shared Init-Funktion ......................................................... 296

shared-Eigenschaft .................................................. 536, 537

shared-Methode ................................................................... 416

sharedApplication-Methode .......................... 517, 1179

sharedWorkspace-Methode ....................................... 1179

shift-Eigenschaft .................................................................. 720

Short-Circuit Evaluation .................................................... 80

Shortest Path Algorithm .............................................. 1242

shouldAutorotate-Eigenschaft ................................... 812

shouldChangeCharactersInRange-Parameter 1117

shouldPerformSegue-Methode .................................. 468

shouldUseExtendedBackgroundIdleMode-

Eigenschaft .................................................................... 605

showDetailViewController-Methode ..................... 489

1298

“buch” — 2017/10/6 — 8:49 — page 1299 — #1295

Index

showPhysics-Eigenschaft ............................................... 842

showWindow-Methode ................................................... 525

Shuffle-Algorithms ............................................................. 225

Signatur vonMethoden ....................................... 276, 433

Simulator (iOS) ...................................................................... 378

GPS-Funktionen .............................................................. 675

Singleton-Muster ................................................................. 259

size-Eigenschaft .................................................................... 719

SpriteKit ............................................................................... 815

sizeThatFits-Methode ....................................................... 497

sizeToFit-Methode .............................................................. 453

SKAction-Klasse .................................................................... 832

SKEmitterNode-Klasse ..................................................... 872

SKLabelNode-Eigenschaft .............................................. 818

SKPhysicsBody-Klasse ...................................................... 842

SKPhysicsContact-Klasse ................................................ 845

SKPhysicsContactDelegate-Protokoll ....... 841, 1204

SKPhysicsWorld-Klasse .................................................... 841

visualisieren ...................................................................... 842

SKScene-Klasse ...................................................................... 808

in eine andere Szene wechseln ............................... 868

Scene-Editor ...................................................................... 865

SKShapeNode-Klasse ......................................................... 816

SKSpriteNode-Klasse ......................................................... 810

SKTransition-Klasse ........................................................... 868

SKU (Stock Keeping Unit) ............................................... 960

SKView-Klasse ........................................................................ 847

sleep-Funktion ...................................................................... 926

Slices (Arrays) ......................................................................... 212

sort-Methode ............................................................... 185, 214

für NSTableView .............................................................. 659

sortDescriptors-Eigenschaft ........................................ 659

CloudKit ............................................................................... 902

sortDescriptorsDidChange-Parameter ................. 659

sorted-Methode .................................................................... 214

sortedArray-Methode ....................................................... 659

Sortieren (CloudKit) ........................................................... 902

Sortierordnung für Zeichenketten ........................... 186

Source Control ....................................................................... 973

sourceOperationMaskFor-Parameter .................... 730

sourceOperationMaskForDraggingContext-

Parameter .......................................................... 736, 1185

sourceRect-Eigenschaft ................................................... 499

sourceType-Eigenschaft ................. 781, 784, 788, 790

sourceView-Eigenschaft .................................................. 499

spacing-Eigenschaft ........................................................... 436

spctl-Kommando ................................................................. 967

speed-Eigenschaft ............................................................... 858

Speicherplatz ermitteln ................................................... 559

Speicherverwaltung ........................................................... 282

Spinner-Steuerelement ................................................... 920

split-Methode ............................................................. 192, 224

Split-View-Controller ............................. 482, 1167, 1168

Delegation ....................................................................... 1181

NYT-Beispiel .................................................................... 1053

Splitter-Steuerelement .................................................... 529

splitView-Methode .......................................................... 1181

splitViewController-Methode ..................................... 490

SpriteKit ..................................................................................... 803

SQLite (Vapor) ..................................................................... 1025

sqlite.json-Datei (Vapor) ............................................... 1025

srand48-Funktion .................................................. 169, 1134

SSLHandshake failed (NSURL-Klasse) ..................... 602

Stack-Button ........................................................................... 418

Stack-Speicher ....................................................................... 137

Stack-View ................................................................................ 435

Animationen ..................................................................... 709

rückgängig machen ..................................................... 392

Standarddialoge ................................................................... 533

iOS ........................................................................................... 503

Standardfunktionen .......................................................... 145

standardOutput-Eigenschaft ....................................... 369

Standardprotokolle ............................................................ 314

standardUserDefaults-Methode ................................ 530

startAccelerometerUpdates-Methode ................... 827

Startansicht ............................................................................. 939

startDeviceMotionUpdates-Methode .................... 827

startGyroUpdates-Methode ......................................... 827

startIndex-Eigenschaft ..................................................... 193

startRunning-Methode .................................................... 794

starts-Methode ...................................................................... 219

startUpdatingHeading-Methode .............................. 683

startUpdatingLocation-Methode .............................. 679

state-Eigenschaft ...................................... 550, 1064, 1189

Static Properties ................................................................... 259

static-Schlüsselwort ........................................................... 275

Statische Methoden ........................................................... 275

Statusbar ........................................................................ 552, 812

anzeigen .............................................................................. 438

statusItem-Methode .......................................................... 553

Steuerelemente

ein- und ausblenden ..................................................... 709

selbst programmieren ................................................. 687

stop-Methode ......................................................................... 759

Stored Properties ................................................................. 254

Storyboard

Fenster per Code erzeugen ........................................ 525

iOS ................................................................................ 375, 376

macOS ................................................................................... 519

storyboard-Eigenschaft ................................................... 525

stride-Funktion ..................................................................... 125

String-Datentyp .................................................................... 179

Interpolation .......................................................... 181, 197

als Datei lesen/schreiben ........................................... 595

Konstruktor ....................................................................... 166

1299

Page 56: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1300 — #1296

Index

string-Methode

DateFormatter ................................................................. 203

NumberFormatter ......................................................... 199

String.Index-Datentyp ..................................................... 193

stringByAppendingPathComponent-

Methode ........................................................................ 1190

stringValue-Eigenschaft ....................................... 516, 658

stroke-Methode ................................. 691, 722, 733, 1086

strokeColor-Eigenschaft .................................................. 816

strong-Schlüsselwort ........................................................ 283

struct-Schlüsselwort .......................................................... 244

Strukturen ................................................................................ 242

verschachteln ................................................................... 249

styleMask-Eigenschaft .......................................... 523, 524

Subclassing .............................................................................. 287

Subscriptions (CloudKit) ................................................. 891

Subscripts ................................................................................. 278

bequemer Zeichenkettenzugriff ............................ 195

Fehler auslösen ................................................................ 349

Substring-Struktur ............................................................. 195

Substrings lesen ................................................................... 193

subtract-Methode ................................................................ 167

subtracting-Methode ........................................................ 167

subviews-Eigenschaft .................................................... 1145

Suchen und Ersetzen in Zeichenketten ................ 188

suffix-Methode ..................................................................... 218

super-Schlüsselwort .......................................................... 291

supportedFlashModes-Eigenschaft ......................... 796

supportedInterfaceOrientation-Eigenschaft .... 812

swap-Funktion ....................................................................... 147

swapAt-Methode ....................................................... 147, 214

Swift

Compiler ................................................................................. 38

Interpreter ............................................................................. 37

Package Manager .......................................................... 993

Playgrounds für das iPad ............................................. 39

Versionstest ....................................................................... 116

swift-Schlüsselwort ................................................. 146, 176

swiftdoc-Dateien .................................................................. 360

swiftmodule-Dateien ........................................................ 360

Swipe Gesture Recognizer ............................................. 726

switch-Verzweigungen ..................................................... 112

Enumeration ..................................................................... 252

Tupel ...................................................................................... 234

sync-Methode ........................................................................ 926

synchronize-Methode (iCloud) ................................... 883

Syntaktischer Zucker

Generics ............................................................................... 301

Optionals ............................................................................. 104

Synthesized Headers ......................................................... 972

systemd-Service (Vapor) ............................................... 1039

systemFreeSize-Konstante ............................................ 560

Systemfunktionen aufrufen ......................................... 369

Systemklänge abspielen .................................................. 768

systemSize-Konstante ...................................................... 560

systemStatusBar-Methode ............................................ 553

systemVersion-Eigenschaft .......................................... 559

Szene (iOS) ............................................................................... 376

T

Tab-Bar-Controller .............................................................. 476

Tab-Bar-Items ......................................................................... 477

Tab-View-Controller ........................................................... 526

tabBarController-Eigenschaft ...................................... 481

Table-View-Steuerelement

individuelle Zellengestaltung ................................. 640

iOS ........................................................................................... 629

Listeneintrag per Code auswählen ...................... 634

macOS ................................................................................... 650

Prototypzellen .................................................................. 635

Pull to Refresh .................................................................. 648

Reaktion auf Elementauswahl ............................... 634

veränderliche Listen ..................................................... 647

Zellenhöhe einstellen ................................................... 644

tableFooterView-Eigenschaft ....................................... 635

tableView-Methoden ........................ 632, 652, 657, 753

Icon-Resizer-Beispiel ................................................. 1182

tableViewSelectionDidChange-Methode ............. 660

Tag-Eigenschaft (Tab-Bar-Item) .................................. 479

Tap Gesture Recognizer ................................................ 1118

Targets (Xcode) ................................................................... 1249

Tastatur (iOS) .............................................................. 379, 448

ausblenden ........................................................... 452, 1118

einblenden ....................................................................... 1069

Tastaturfokus setzen ...................................... 452, 1092

Tastatur (macOS) .................................................................. 538

Teilzeichenketten extrahieren .................................... 193

TelevisionMarkup Language ....................................... 555

Temporäre Datei .................................................................. 588

Temporäres Verzeichnis .................................... 588, 1190

Inhalt löschen ................................................................... 784

terminate-Methode .............................................. 517, 1179

terminator-Parameter ...................................................... 147

Ternärer Operator .................................................................. 84

Beispiel ...................................................... 710, 1148, 1158

Terrains (in Tiled) .............................................................. 1213

testable-Attribut ........................................................ 248, 365

Testflight ................................................................................... 892

Textdateien .............................................................................. 595

Texteingaben (iOS) .............................................................. 448

textField-Methode ................................................. 451, 1117

textFieldShouldReturn-Methode .............................. 450

textLabel-Eigenschaft ....................................................... 636

Textur

Atlas .......................................................................... 833, 1209

SpriteKit ............................................................................... 811

1300

“buch” — 2017/10/6 — 8:49 — page 1301 — #1297

Index

Textured Button ................................................................ 1168

throws-Schlüsselwort ....................................................... 346

bei Funktionsparametern ......................................... 350

Eigenschaften und Subscripts ................................ 349

in Init-Funktionen .......................................................... 347

Tilde-Operator (binäre Inversion) ................................ 75

Tiled Textures ........................................................... 815, 1210

Tiled-Programm ................................................................ 1210

Tilemaps ................................................................................. 1210

Tileset ....................................................................................... 1211

timeIntervalSince-Methode ......................................... 205

Timer-Klasse ........................................................................... 925

AVAudioRecorder-Beispiel ......................................... 776

Tint-Color (SFSafariViewController) ........................ 626

titleForRow-Parameter ................................................. 1122

TLSv1.2-SSL-Verschlüsselung für NSURL ............... 602

To-do-Liste ............................................................................. 1060

iCloud-Variante ............................................................ 1070

REST-API (Vapor) .......................................................... 1013

Token (Vapor-Authentifizierung) ........................... 1030

Tool-Tipps .............................................................................. 1169

Toolbox (Vapor) .................................................................... 995

Top Layout Guide ................................................................. 432

Top Shelf Image (tvOS) ..................................................... 946

topViewController-Eigenschaft .................................. 488

touches-Methoden .................................................. 712, 819

Asteroids-Beispiel ........................................................ 1268

Breakout-Spiel ............................................................... 1202

Kanonenkugel-Beispiel ............................................... 862

Pac-Man-Beispiel ......................................................... 1230

tvOS ........................................................................................ 562

touchesBegan-Methode ............................................... 1153

touchesEnded-Methode ............................................... 1153

Trackpad .................................................................................... 718

Trailer-Beispiel ....................................................................... 661

Trailing Closures .................................................................. 155

Trailing-constraint-Warnung ....................................... 431

Traits (Auto Layout) ............................................................ 440

traits-Methode ...................................................................... 536

Transaktionen (CloudKit) ............................................... 891

translatesAutoresizingMaskIntoConstraints-

Eigenschaft .................................................................... 433

Transparenz ............................................................................ 708

trashDirectory-Konstante .............................................. 587

trashItem-Methode ............................................................ 593

trimmingCharacters-Methode ................................... 186

true ................................................................................................ 170

truncatingRemainder-Methode ............................. 1215

try-catch-Konstruktion .................................................... 337

Forced Try ........................................................................... 343

mit do-catch ...................................................................... 338

ohne do-catch .................................................................. 342

Optional Try ...................................................................... 343

Tupel ............................................................................................ 233

als Rückgabewert von Funktionen ...................... 130

in switch-Konstruktionen ......................................... 114

switch-Auswertung ....................................................... 234

TVML-Apps ............................................................................... 555

tvOS .............................................................................................. 555

Asteroids-Spiel .............................................................. 1255

Bewegungssteuerung .................................... 830, 1269

Pac-Man ............................................................................ 1249

touch-Ereignisse ............................................................. 823

Versionsnummer ermitteln ...................................... 559

Videos abspielen ............................................................. 778

Type Annotation ..................................................................... 94

Type Constraints .................................................................. 302

Type Properties ..................................................................... 259

type-Funktion ............................................................. 333, 334

Type-Schlüsselwort ............................................................ 334

typealias-Schlüsselwort ................................................... 281

AnyClass-Datentyp ....................................................... 320

Generics ............................................................................... 304

Typen

Aliasse ................................................................................... 281

Enumerationen ............................................................... 250

Klassen und Strukturen .............................................. 242

Metatypen .......................................................................... 334

Referenz- und Werttypen ........................................... 104

Typmethoden ........................................................................ 275

U

Ubuntu ....................................................................................... 988

Uhrzeit ........................................................................................ 203

UIActionController-Klasse ......................................... 1099

UIActivityIndicatorView-Steuerelement ............. 920

UIAlertAction-Klasse ......................................................... 504

UIAlertController-Klasse ................................................ 503

UIApplication-Eigenschaft ............................................ 416

UIApplication-Klasse .............................................. 415, 622

UIApplicationDelegate-Protokoll ............................. 415

UIApplicationMain-Attribut .............................. 365, 415

UIBarButtonItem-Klasse ................................................. 472

UIBarButtonItem-Steuerelement ............................. 473

UIBezierPath-Klasse .......................................................... 860

Beispiel Kompass ............................................................ 694

Beispiel Richtungsanzeige ..................................... 1086

Grundlagen ........................................................................ 691

UIButton-Steuerelement ................................................ 433

UICollectionView-Steuerelement ............................. 661

Beispiel zur Farbauswahl .......................................... 886

UIColor-Klasse ....................................................................... 413

Assets verwenden .......................................................... 586

erweitern .......................................................................... 1132

UIDevice-Klasse ......................................................... 447, 559

UIDeviceOrientationDidChange-Konstante ...... 447

1301

Page 57: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1302 — #1298

Index

UIDeviceOrientationDidChange-Nachricht ...... 699

UIDocument-Klasse ........................................................... 877

UIDocumentBrowserViewController-Klasse ..... 877

UIDragInteraction-Klasse .................................... 745, 746

UIDragInteractionDelegate-Protokoll ......... 743, 746

UIDragItem-Klasse ........................................ 743, 746, 753

UIDragSession-Klasse ............................................ 743, 746

UIDropInteraction-Klasse .............................................. 748

UIDropInteractionDelegate-Protokoll ................... 743

UIDropProposal-Klasse ......................................... 747, 748

UIDropSession-Klasse ...................................................... 748

UIEdgeInsets-Klasse .......................................................... 809

UIFocusUpdateContext-Klasse ................................... 571

UIFont-Klasse ......................................................................... 397

UIGestureRecognizer-Klasse ....................................... 725

UIGestureRecognizerDelegate-

Protokoll .......................................................... 1062, 1118

UIGraphicsGetCurrentContext-Methode ............ 702

UIGraphicsImageRenderer-Klasse ........................... 705

UIImage-Klasse ..................................................................... 639

Assets verwenden .......................................................... 585

Bild herunterladen ........................................................ 602

UIImagePickerController-Klasse .................... 781, 788

UIImageView-Klasse

eigener Renderer-Code ................................................ 705

Instanz per Code erzeugen .................................... 1122

UIImageView-Steuerelement .............. 457, 642, 1104

UIKit-Framework ................................................................. 409

UILabel-Klasse .................................................................... 1122

mehrzeiliger Text ........................................................... 453

UILongPressGestureRecognizer-Klasse 1062, 1064

UINavigationController-Klasse .................................. 471

Beschriftung ändern ..................................................... 474

Navigation per Code .................................................... 474

UInt-Datentyp ....................................................................... 166

UIPasteConfiguration-Klasse ....................................... 745

UIPickerView-Steuerelement ...................... 1106, 1119

Rollover ............................................................................. 1121

UIPickerViewDataSource-Protokoll ...................... 1121

UIPickerViewDelegate-Protokoll ............................ 1121

UIPopoverPresentationControllerDelegate-

Protokoll .......................................................................... 495

UIRefreshControl-Klasse ................................................ 649

UIScreen-Klasse .................................................................... 408

UISplitViewController-Klasse ...................................... 482

NYT-Beispiel .................................................................... 1053

UISplitViewControllerDelegate-Protokoll ........... 490

UIStackView-Steuerelement .............................. 418, 435

UIStoryboardSegue-Klasse ............................................ 467

UISwipeGestureRecognizer-Klasse .......................... 726

UISwitch-Steuerelement ................................................. 709

UITabBarController-Klasse ............................................ 476

UITabBarControllerDelegate-Protokoll ................. 481

UITabBarItem-Klasse ......................................................... 477

UITableView-Steuerelement ........................................ 629

Delete on Swipe ............................................................ 1067

Drag&Drop ...................................................................... 749

individuelle Zellengestaltung ................................. 640

Prototypzellen .................................................................. 635

Pull to Refresh .................................................................. 648

veränderliche Listen ..................................................... 647

Zellenhöhe einstellen ................................................... 644

UITableViewCell-Klasse ................... 631, 632, 642, 644

UITableViewCellStyle-Enumeration ........................ 636

UITableViewController-Klasse .................................... 630

UITableViewDataSource-Protokoll .......................... 632

UITableViewDelegate-Protokoll ...................... 634, 644

UITableViewDragDelegate-Protokoll ...................... 753

UITableViewDropCoordinator-Protokoll ............. 754

UITableViewDropDelegate-Protokoll ..................... 753

UITableViewDropProposal-Klasse ............................ 753

UITapGestureRecognizer-Klasse ............................ 1118

UITextField-Steuerelement ........................................... 448

EditingChanged-Ereignis ........................................ 1118

ValueChanged-Ereignis ........................................... 1118

UITextFieldDelegate-Protokoll ................................... 450

UITextView-Steuerelement ........................................... 413

UITouch-Klasse ............................................. 712, 819, 1153

UIView-Klasse ................................................ 408, 688, 1086

Größenänderung feststellen ................................. 1153

Instanz per Code erzeugen .................................... 1122

UIViewController-Klasse ...................................... 408, 410

Lebenszyklus ..................................................................... 410

UIWebView-Steuerelement ........................................... 622

NYT-Bestseller-App ..................................................... 1052

UIWindow-Klasse ..................................................... 407, 416

Umrandung eines Steuerelements .......................... 413

Unärer Operator ...................................................................... 84

Unable to simultaneously satisfy constraints

(Fehlermeldung) ......................................................... 433

Unbenannte Parameter ................................................... 139

Unicode

Skalar .................................................................................... 183

Textdateien ........................................................................ 595

unicodeScalars-Eigenschaft .......................................... 191

Beispiel .................................................................................. 264

Uniform Resource Locator ............................................ 582

uniqueKeysWithValues-Parameter ......................... 227

uniqueSet-Methode ........................................................... 330

uniquingKeys-Parameter (Dictionary) .................. 228

unlockFocus-Methode ................................................... 1173

unlockForConfiguration-Methode .......................... 800

unowned-Schlüsselwort ................................................. 283

unowned self in Closures ................................ 161, 707

unrecognized-selector-Fehler ..................................... 386

unregisterDraggedTypes-Methode ....................... 1178

1302

“buch” — 2017/10/6 — 8:49 — page 1303 — #1299

Index

UnsafeMutablePointer-Struktur ............................... 367

Unwind Segues ........................................................... 462, 467

Popups .................................................................................. 501

Unwrapping-Operator .............................................. 85, 101

Upcast ......................................................................................... 297

updateFocusIfNeeded-Methode ................... 571, 1277

uppercased-Methode ........................................................ 186

URL-Klasse .................................................................. 601, 1108

url-Methode (Bundle-Datei) ......................................... 585

URL-Struktur .......................................................................... 582

URLForRessource-Methode .......................................... 530

URLRequest-Klasse ............................................... 622, 1052

URLs-Eigenschaft ................................................................. 535

urls-Methode (FileManager) ......................................... 587

urlSession-Delegate-Methoden ................................. 606

URLSession-Klasse .............................................................. 604

URLSessionDownloadDelegate-Protokoll ........... 604

URLSessionDownloadTask-Klasse ............................ 604

useGroupingSeparator-Eigenschaft ........................ 199

User-Defaults .................................................... 530, 577, 577

Asteroids-Spiel ............................................................... 1274

Beispiel ............................................................................... 1061

Defaultwerte ..................................................................... 530

iOS ........................................................................................... 577

macOS ................................................................................... 530

Währungsumrechner ................................................ 1111

userAcceleration-Eigenschaft ..................................... 828

userDirectory-Konstante ................................................ 587

userDomainMask-Konstante ...................................... 587

userInitiated-Enumerationswert .............................. 922

usesGroupingSeparator-Eigenschaft ................... 1115

usesPreciseCollisionDetection-Eigenschaft ....... 857

utf16-Eigenschaft ................................................................. 192

UTF8

Textdateien ........................................................................ 595

Zeichenketten ................................................................... 179

utf8-Eigenschaft ............................................................. 192

utf8-Konstante ................................................................. 201

UUIDs erzeugen ................................................................... 588

uuidString-Eigenschaft .................................................... 588

V

validateMenuItem-Methode ........................................ 550

values-Eigenschaft .............................................................. 229

Vapor-Framework ................................................................ 986

Docker ................................................................................ 1003

HelloWorld ........................................................................ 996

Installation ........................................................................ 995

vapor-Kommando ............................................................... 995

var-Schlüsselwort ................................................................... 93

in switch-Konstruktionen ......................................... 114

mit if ....................................................................................... 108

mit while .............................................................................. 119

Variablen ...................................................................................... 93

Variablennamen ................................................................ 94

Variadics ..................................................................................... 144

Vary for Traits ......................................................................... 444

velocity-Eigenschaft .......................................................... 857

Veränderliche Parameter ................................................ 142

Vererbung ................................................................................. 287

bei Steuerelementen ..................................................... 687

eigene UIView-Klasse ................................................... 688

Protokolle ........................................................................... 307

Vergleichsoperatoren .......................................................... 76

Verschachtelte Funktionen ........................................... 135

Versionsabhängiger Code .............................................. 115

Versionsnummer ermitteln (iOS/tvOS) ................ 559

verticalAlignmentMode-Eigenschaft ..................... 818

Verzeichnisse

auswählen ............................................................ 533, 1179

ermitteln .............................................................................. 586

erzeugen ........................................................................... 1191

Größe rekursiv ermitteln ........................................... 592

löschen ............................................................................... 1190

Inhalt auflisten ................................................................ 589

temporäres Verzeichnis ........................................... 1190

Verzeichnistest ................................................................. 591

Verzweigungen ...................................................................... 107

videoGravity-Eigenschaft ............................................... 778

Videos

abspielen ............................................................................. 777

aufnehmen ........................................................................ 783

auswählen .......................................................................... 781

YouTube ............................................................................... 785

View

Größe fixieren ................................................................... 523

schließen (macOS) ......................................................... 524

View-Controller .......................................................... 410, 508

Root-View-Controller ........................................ 411, 416

view-Eigenschaft ....................................................... 433, 553

viewControllers-Eigenschaft ............................. 481, 488

viewDidAppear-Methode .................................... 411, 524

Animationen ..................................................................... 708

macOS ................................................................................... 888

viewDidDisappear-Methode ................ 411, 517, 1179

viewDidLayoutSubviews-Methode .......................... 411

viewDidLoad-Methode .................................................... 413

Animationen ..................................................................... 708

macOS ................................................................................... 514

viewForTableColumn-Parameter .............................. 657

viewWillAppear-Methode ................................... 411, 473

viewWillDisappear-Methode ............... 411, 473, 1097

viewWillLayoutSubviews-Methode ......................... 411

Volltextsuche (CloudKit) ................................................. 901

Volumes (Docker) ................................................................ 990

Volumes (SpriteKit) ............................................................ 856

1303

Page 58: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

“buch” — 2017/10/6 — 8:49 — page 1304 — #1300

Index

W

wait-Methode (SpriteKit-Aktionen) ......................... 836

WAV-Format ............................................................................ 759

weak-Schlüsselwort ............................................................ 283

Beispiel ....................................................................... 382, 522

Web-View ................................................................................... 622

Beispiel ............................................................................... 1052

NYT-Bestseller-App ..................................................... 1052

WebKit-Bibliothek ............................................................... 622

Webseiten anzeigen ........................................................... 621

im Browser ......................................................................... 621

in der App ............................................................................ 622

Werttypen ......................................................................... 72, 104

where-Schlüsselwort

Protokollerweiterungen ............................................. 329

Regeln für generische Datentypen ...................... 302

switch/case ......................................................................... 114

while-Schleife ......................................................................... 118

let (Optionals) ........................................................ 119, 188

width-Eigenschaft ............................................................... 719

Wildcard-Pattern-Zeichen ................................................. 72

Willkommensbildschirm ............................................... 939

willSet-Funktion ........................................................ 257, 290

Window-Controller ............................................................. 508

window-Eigenschaft ..................................... 416, 524, 553

with-Funktion

SpriteKit ............................................................................... 844

UIBezierPath ..................................................................... 697

withSize-Methode ............................................................... 397

WKWebView-Klasse ............................................................ 622

NYT-Beispiel .................................................................... 1056

write-Methode ......................................................... 595, 1111

write-Methode (Data-Struktur) ................................ 1081

writeToFile-Methode ......................................................... 355

Wuziqi ...................................................................................... 1127

X

x-Eigenschaft .......................................................................... 719

Xcassets-Datei ............................................................. 455, 584

Spritekit ................................................................................ 813

UIImage-Objekt erzeugen ......................................... 639

URL von Bild erzeugen ................................................ 899

Xcode .............................................................................................. 22

Arbeitstechniken ............................................................. 971

Code-Konverter ................................................................... 67

Crashkurs ............................................................................... 58

Crashlogs ............................................................................ 976

erste Schritte ........................................................................ 31

für Server-Projekte ...................................................... 1002

Git ............................................................................................ 973

Hello iOS-World ............................................................... 374

Literale .................................................................................. 811

mehrsprachige Apps ..................................................... 947

Projekte umbenennen ................................................. 978

Refactoring ........................................................................ 977

Verzeichnisse aufräumen .......................................... 979

XIB-Datei ................................................................................... 412

XLIFF-Dateien ......................................................................... 951

XML-Bibliothek .................................................................. 1107

XML-Daten verarbeiten ................................................... 610

XMLAttribute-Klasse ......................................................... 610

XMLElement-Klasse ........................................................... 610

XMLIndexer-Klasse ............................................................ 610

XMLParser-Klasse ................................................................ 610

XWXMLHash-Bibliothek ................................................. 610

Y

y-Eigenschaft .......................................................................... 719

youtube-ios-player-helper-Bibliothek ................... 785

YouTube-Videos abspielen ............................................ 785

YTPlayerView-Klasse .......................................................... 786

YTPlayerViewDelegate-Protokoll ............................... 787

Z

Zahlen ......................................................................................... 166

Zeichenketten ........................................................................ 179

als Datei lesen/schreiben ........................................... 595

Copy-on-Write .................................................................. 183

in Data-Element umwandeln ................................. 617

Länge ..................................................................................... 184

sortieren .............................................................................. 185

Substrings bequemer lesen ...................................... 195

Substrings lesen .............................................................. 193

Teilzeichenketten extrahieren ................................ 193

vergleichen ......................................................................... 185

zeilenweise zerlegen ..................................................... 369

Zeit ................................................................................................ 203

messen .................................................................................. 205

vergleichen ......................................................................... 206

Zeit formatieren ................................................................... 776

Zellenhöhe einstellen (Table-View) .......................... 644

zero-Eigenschaft ................................................................... 173

zip-Funktion ................................................................. 148, 227

Zip2Sequenz-Datentyp .................................................... 148

Zonen (CloudKit) .................................................................. 891

zPosition-Eigenschaft ....................................................... 811

zRotation-Eigenschaft ...................................................... 815

Zufallszahlen .......................................................................... 169

Zugriffsebenen ...................................................................... 246

Zuweisung ................................................................................... 72

Zweidimensionale Arrays ........................................... 1132

Zweinamige Parameter ................................................... 140

1304

Page 59: issen wies eht - Store & Retrieve Data Anywhere · Leseprobe Dieses Handbuch ist der perfekte Start in die Programmiersprache Swift, mit allen Grundlagen und vielen Beispiel-Apps.

Wissen, wie’s geht.

Wir hoffen sehr, dass Ihnen diese Leseprobe gefallen hat. Gerne dürfen Sie diese Leseprobe empfehlen und weitergeben, aller-dings nur vollständig mit allen Seiten. Die vorliegende Leseprobe ist in all ihren Teilen urheberrechtlich geschützt. Alle Nutzungs- und Verwertungsrechte liegen beim Autor und Verlag.

Teilen Sie Ihre Leseerfahrung mit uns!

Michael Kofler

Swift 4 – Das umfassende Handbuch

1.304 Seiten, gebunden, Oktober 2017 49,90 Euro, ISBN 978-3-8362-5920-0

www.rheinwerk-verlag.de/4494

Michael Kofler hat Telematik an der TU Graz studiert. Er zählt zu den erfolgreichsten und vielseitigsten Com-puterbuchautoren im deutschen Sprachraum. Zu sei-nen Themengebieten zählen neben Java auch Linux, OS X, der Raspberry Pi, MySQL, KVM, Visual Basic und Excel-VBA. Viele seiner Bücher wurden übersetzt. Michael Kofler arbeitet auch als Software-Entwickler, Berater sowie als Lehrbeauftragter an zwei Fachhoch-schulen.

Wissen, wie’s geht.