Log In
Or create an account ->
Imperial Library
Home
About
News
Upload
Forum
Help
Login/SignUp
Index
Liebe Leser!
Inhaltsverzeichnis
Vorwort
Teil I Swift
1 Hello World!
1.1 »Hello World« im Playground
Apple Developer Program
Den Playground starten
Hello World!
Die erste Schleife
Grafische Darstellung von Daten
Darstellung von Objekten
Kommentare
Playgrounds mit mehreren Dateien
1.2 »Hello World« als Terminal-App
Xcode kennenlernen
Die Foundation
Wo ist die App?
Mehr als nur »Hello World!«
Den Swift-Interpreter und -Compiler direkt aufrufen
1.3 »Hello World« auf dem iPad
2 Swift-Crashkurs
2.1 Elementare Syntaxregeln und Kommentare
Kommentare
Markdown-Kommentare
MARK-Kommentar
2.2 Variablen, Konstanten und Datentypen
Zahlen und Zeichenketten
Datentypen und Optionals
Tupel, Arrays und Dictionaries
2.3 Strukturierung des Codes
Schleifen
Verzweigungen
Funktionen
Closures
Eigene Operatoren
2.4 Klassen und Datenstrukturen
Protokolle
2.5 Fehlerabsicherung
try? und try!
2.6 Xcode-Crashkurs
Xcode-Oberfläche
Navigator
Editor
Assistenzeditor
Maus- bzw. Trackpad-Kürzel
Tastenkürzel und Editoreinstellungen
Werkzeugleiste (Inspector und Library Pane)
Code-Snippets
Speichern
Xcode-Projekte von Swift 3 auf Swift 4 umstellen
Konvertierungserfahrungen
3 Operatoren
3.1 Zuweisungs- und Rechenoperatoren
Einfache Zuweisung
Wert- versus Referenztypen
Elementare Rechenoperatoren
Zeichenketten aneinanderfügen
Inkrement und Dekrement
Rechnen mit Bits
Kombinierte Rechen- und Zuweisungsoperationen
3.2 Vergleichsoperatoren und logische Operatoren
Vergleichsoperatoren
== versus ===
Vergleiche mit ~=
Datentyp-Vergleich (»is«)
Casting-Operator (»as«)
Logische Operatoren
3.3 Range-Operatoren
Range-Operatoren in Schleifen
Range-Operatoren und Arrays
Range-Operatoren in switch-Konstrukten
Range-Operatoren für Fließkommazahlen
Range-Operatoren für Zeichenketten
3.4 Operatoren für Fortgeschrittene
Ternärer Operator
Unwrapping- und Nil-Coalescing-Operator
Optional Chaining
Operator-Präferenz
3.5 Eigene Operatoren
Operator Overloading für komplexe Zahlen
Neuer Vergleichsoperator für Zeichenketten
Neuer Exponential-Operator in einer eigenen Prioritätsgruppe
Neuer Unwrap-or-Die-Operator
Weitere Beispiele für eigene Operatoren
4 Variablen und Optionals
4.1 Variablen und Konstanten
Deklaration von Variablen
Regeln für Variablennamen
Konstanten
Eigenschaften
Enumerationen (Enums)
rawValues
4.2 Optionals
Optionals deklarieren
Optionals auslesen
nil-Test und if-let
Optional Chaining
Nil Coalescing
Syntaktischer Zucker
Noch mehr Optionals
4.3 Wert- versus Referenztypen
Werttypen
Referenztypen
Wert- von Referenztypen unterscheiden
5 Verzweigungen und Schleifen
5.1 Verzweigungen mit if
Ternärer Operator und Nil-Coalescing-Operator
if-let-Kombination für Optionals
Code aus der Praxis
if-let-Kaskaden
if-let mit Bedingungen kombinieren
5.2 Inverse Logik mit guard
Beispiel-Code ohne guard
Verbesserte Variante mit guard
5.3 Verzweigungen mit switch
switch für Tupel
case-let-Kombination mit where
5.4 Versions- oder plattformabhängiger Code
Versionstests mit #available
Plattformtests mit #if
5.5 Schleifen
for-in
while
while-let-Kombination
repeat-while
break
continue
Implizite Schleifen
5.6 Nicht triviale Schleifen
while statt for
for-in statt for
Array rückwärts durchlaufen
Schleifen mit Double-Variablen
stride-Funktion
6 Funktionen und Closures
6.1 Funktionen definieren und ausführen
Benannte Parameter
Rückgabewerte
Tupel als Rückgabewerte
Optionals als Rückgabewerte
Rückgabewert ignorieren
Aufräumarbeiten automatisch ausführen (defer)
Funktionsnamen und Overloading
Gültigkeitsebenen von Variablen
Verschachtelte Funktionen
Rekursion
Fehlerbehandlung
Funktionen ohne Rückkehr (Never-Funktionen)
6.2 Parameter
Gewöhnliche Parameter
Unbenannte Parameter (namenlose Parameter)
Zweinamige Parameter
API-Design-Richtlinien
Veränderlicher Parameter (inout)
Optionale Parameter und Defaultwerte
Variable Parameteranzahl (Variadics)
6.3 Standardfunktionen
min und max
print und readline
swap
zip
Mathematische Funktionen und Konstanten
6.4 Funktionale Programmierung
Funktionen als eigener Datentyp
Funktionen als Parameter und Rückgabeergebnisse
6.5 Closures
Syntax
Kurz und kürzer
Noch mehr Syntaxbeispiele
Auto-Closures
RPN-Rechner
Capturing Values
Gefahr von Memory Leaks (Capture Lists)
Closures speichern und weitergeben (@escaping)
7 Zahlen und geometrische Strukturen
7.1 Zahlen und boolesche Werte
Ganze Zahlen
Fließkommazahlen
FloatingPoint-Protokoll
Typumwandlungen
Failable Init-Funktion
Zufallszahlen
Double-Zufallszahlen
Boolesche Werte
Codable-Unterstützung
7.2 NSNumber
7.3 CGFloat, CGPoint, CGSize und Co.
CGFloat-Zahlen
CGXxx-Strukturen
Eigene Operatoren für CGXxx-Strukturen
CGRect-Struktur erweitern
CGPoint-Struktur erweitern
Erweiterungsmöglichkeiten
8 Zeichenketten
8.1 Syntax
Mehrzeilige Zeichenketten
Spezialzeichen
Schleifen
String versus NSString
String-Eigenschaften
8.2 Bearbeitung von Zeichenketten
Länge von Zeichenketten ermitteln
Vergleichen und sortieren
Zeichenketten manipulieren
Palindrom-Test
8.3 Suchen und ersetzen
Reguläre Ausdrücke
8.4 Zeichenketten zerlegen und zusammensetzen
components, split und joined
Teilzeichenketten extrahieren
Die Substring-Struktur
Teilzeichenketten komfortabler auslesen
8.5 Zeichenketten und Zahlen umwandeln
String-Interpolation
Zahlen formatieren
Zahlen mit dem NumberFormatter formatieren
Zeichenketten in Zahlen umwandeln (parsen)
Zahlen mit dem NumberFormatter parsen
8.6 Zeichenketten und binäre Daten umwandeln (Data-Struktur)
9 Datum und Uhrzeit
9.1 Datum und Uhrzeit ermitteln und darstellen
Datum und Zeit formatieren (DateFormatter)
Datum und Zeit parsen (DateFormatter)
Zeitkomponenten extrahieren
9.2 Rechnen mit Datum und Uhrzeit
Zeit messen
Zeiten vergleichen
10 Arrays, Dictionaries, Sets und Tupel
10.1 Arrays
Arrays initialisieren
Mehrere Array-Elemente initialisieren
Array-Elemente auslesen
ArraySlices
Arrays manipulieren
Arrays sortieren und umdrehen
Interna und Geschwindigkeitsüberlegungen
Mehrdimensionale Arrays
10.2 Arrays und Aufzählungen verarbeiten
first und last
prefix und suffix
dropFirst, dropLast und drop
starts, contains und index
filter
map und flatMap
forEach
Arrays ändern (indices und enumerated)
reduce
split und joined
Shuffle-Algorithmen
Doppelgänger entfernen
10.3 Dictionaries
Dictionaries deklarieren und initialisieren
Dictionaries aus zwei Arrays initialisieren
Zugriff auf Dictionary-Elemente
Dictionary-Eigenschaften und -Schleifen
filter und mapValues
10.4 Sets
map und filter
10.5 Option-Sets
Eigene Option-Sets definieren
10.6 Tupel
Anwendungen
Vergleiche
10.7 Lottosimulator
Version 1: elegant, aber langsam
Einige Benchmarktests
Version 2: Swift zeigt, was es kann
11 Objektorientierte Programmierung I
11.1 Klassen und Strukturen
Auch Enumerationen sind Datentypen!
Glossar
Syntax
Das Schlüsselwort »self«
Zugriffsebenen und Zugriffssteuerung
Modifizierer
Verschachtelte Klassen, Strukturen und Enumerationen
Code-Dateien
11.2 Enumerationen
Datentypen und Protokolle für Enumerationen
Zuordnung von Zusatzdaten (Associated Values)
Rekursive bzw. indirekte Enumerationen
11.3 Eigenschaften
Verzögerte Initialisierung von Eigenschaften (Lazy Properties)
Eigenschaften beobachten (Property Observer mit willSet und didSet)
Statische Eigenschaften
Computed Properties (get und set)
Temperaturumrechnung mit Computed Properties
Read-Only-Eigenschaften
Beispiel: Rectangle-Struktur
Beispiel: ChessFigure-Struktur
11.4 Init- und Deinit-Funktion
Syntax für Init-Funktionen
Parameterliste
Code-Reihenfolge in Init-Funktionen
Init-Overloading
Designated versus Convenience Init
Init-Funktion als Optional (Failable Init Functions)
Deinit-Funktion
11.5 Methoden
Instanzmethoden
Mutating Methods
Statische Methoden
Statische Eigenschaft
Signaturen von Methoden
#selector-Syntax
11.6 Subscripts
Beispiel: Schachbrett
11.7 Typ-Aliasse
11.8 Speicherverwaltung
weak und unowned
weak-Beispiel
12 Objektorientierte Programmierung II
12.1 Vererbung
Mehrfachvererbung
Vererbung versus Protokolle versus Extensions
override bei Methoden
override bei Eigenschaften
Das Schlüsselwort super
Das Schlüsselwort final
Initialisierung
Das Schlüsselwort required
Redundanz in Init-Funktionen vermeiden
Generalisierung, Polymorphie und Casting
12.2 Generics
Syntax
Generics in verschachtelten Typen (Nested Generics)
Generics in der Swift-Standardbibliothek
Regeln für generische Typen (Type Constraints)
Generische Typ-Aliasse
12.3 Protokolle
Vorhandene Protokolle implementieren
Selbst Protokolle definieren
Protokolle sind Datentypen
Geometry-Beispiel
Optionale Protokollanforderungen
Generische Protokolle mit »associatedtype«
Generator-Beispiel
12.4 Standardprotokolle
CustomStringConvertible
Hashable und Equatable
Comparable
Any und AnyObject
AnyClass
ExpressibleByStringLiteral
Codable
12.5 Extensions
Syntax
Erweiterung generischer Typen
Übersichtlicherer Code durch Extensions
Beispiel: Rechnen mit Kilo-, Mega- und Gigabyte
Weitere Beispiele
12.6 Protokollerweiterungen
Bedingte Protokollerweiterungen
Beispiel: Die uniqueElements-Methode
Beispiel: Die uniqueSet-Methode
12.7 Reflection und Metatypen
Reflection
KeyPath-Ausdrücke
Metatypen
13 Fehlerabsicherung
13.1 Fehlerabsicherung mit try und catch
try-catch-Syntax
Einführungsbeispiel
Reaktion auf Fehler mit catch
Default-catch
try ohne do-catch
try! und try? (Forced Try und Optional Try)
Doppelte Optionals
Aufräumarbeiten mit defer
Debugging-Hilfe assert
13.2 Selbst Fehler auslösen (throws und throw)
Fehler in Init-Funktionen auslösen
Failable Init Functions
Fehler in Eigenschaften und Subscripts
Parameterabsicherung mit guard
Die NSException-Klasse
13.3 Fehler in Funktionen weitergeben (rethrows)
rethrows in der Praxis
rethrows in eigenen Funktionen und Methoden
13.4 Das Error-Protokoll
Definition einer Error-Enumeration
Definition einer Error-Struktur
13.5 Fehlerabsicherung von API-Methoden (NSError)
Die NSError-Klasse
14 Importe, Attribute und Systemfunktionen
14.1 Module, Frameworks und Importe
Selbst Frameworks erzeugen
Bibliotheken nutzen
CocoaPods
Package Manager
14.2 Attribute
14.3 Systemfunktionen aufrufen
Bridging-Header-Datei verwenden
macOS-Terminal-Kommandos aufrufen
Teil II App-Programmierung
15 Hello iOS-World!
15.1 Projektstart
15.2 Gestaltung der App
Mini-Glossar
Steuerelemente einfügen
Ein erster Test mit dem iOS-Simulator
15.3 Steuerung der App durch Code
Den Button mit einer Methode verbinden (Actions)
Zugriff auf das Textfeld über eine Eigenschaft (Outlets)
Endlich eigener Code
15.4 Actions und Outlets für Fortgeschrittene
Eine Action für mehrere Steuerelemente
Ein Outlet für mehrere Steuerelemente (Outlet Collections)
Actions oder Outlets umbenennen
Zuordnung zwischen Steuerelementen und Actions/Outlets ergründen
Steuerelemente kopieren
15.5 Layout optimieren
Layoutregeln
Layoutregeln für den »Hello-World«-Button
Layoutregeln für das Textfeld
Embed-in-Stack-Aktion rückgängig machen
Wenn es Probleme gibt
15.6 Textgröße mit einem Slider einstellen
Das Slider-Steuerelement hinzufügen
Den Slider mit einer Methode verbinden
15.7 Apps auf dem eigenen iPhone/iPad ausführen
App-Ausführung ohne Kabel
Apple Developer Program
15.8 Komponenten und Dateien eines Xcode-Projekts
Weitere Dateien
Test- und Produktgruppe
16 iOS-Grundlagen
16.1 Model-View-Controller (MVC)
Kommunikation in MVC-Apps
MVC bei Apps mit mehreren Dialogen
16.2 Klassenhierarchie einer App-Ansicht
16.3 Die UIViewController-Klasse
Lebenszyklus eines View-Controllers
Init-Funktion
viewDidLoad-Methode
16.4 Phasen einer iOS-App
Die AppDelegate-Klasse
Zugriff auf den Root-View-Controller und das AppDelegate-Objekt
16.5 Auto Layout
Grundeinstellungen
Viele Wege führen zum Ziel
Layoutregeln im Storyboard-Editor einstellen
Layoutregeln manuell einstellen
Layoutregeln aus der aktuellen Position und Größe ableiten
Regeln ändern und löschen, Steuerelemente neu positionieren
Layoutprobleme in der Document-Outline-Seitenleiste beheben
Layoutregeln im Size Inspector bearbeiten
Content Hugging und Content Compression Resistance
Layoutdetails im Attributinspektor modifizieren
Regelloses Layout (Autoresizing-Optionen)
Tipps und Tricks
Änderungen in Xcode 9
16.6 Layoutregeln durch Code definieren
16.7 Steuerelemente in einer Stack-View anordnen
Funktionsprinzip
Beispiel
Content Compression Resistance Priority
16.8 Layoutvarianten
Kriterien
Layoutregeln mit dem Plus-Button einrichten
Layoutregeln mit »Vary for Traits« einrichten
Layoutregeln für Hoch- und Querformat per Code variieren
16.9 Texteingaben
UITextField-Eigenschaften
Reaktion auf Eingaben
Reaktion auf Return (Hello World, Delegation!)
Eingabe bestimmter Zeichen verhindern
Tastatur ein- und ausblenden
Beispiel
16.10 Image-Views und Xcassets
Xcassets-Dateien
Image-View-Steuerelement
17 iOS-Apps mit mehreren Ansichten
17.1 Storyboard und Controller-Klassen verbinden
17.2 Ansichten durch Segues verbinden
Welcher Segue-Typ ist der richtige?
Zurück an den Start mit Unwind
Segues per Code ausführen
17.3 Segues mit Datenübertragung
Segue-Code für »View 1« (prepare-Methode)
Segue-Code für »View 2«
Segues per Code auslösen
Segues im Textfeld mit Return auslösen
17.4 Navigation-Controller
Funktionsweise
Einstellungen
Steuerung per Code
Beispiel
17.5 Tab-Bar-Controller
Tab-Bar-Items
Kombination aus Tab-Bar- und Navigation-Controller
Programmierung
17.6 Split-View-Controller
Beispiel
Split-View-Controller einfügen
Liste füllen (MasterTVC-Klasse)
Detailansicht (DetailVC-Klasse)
Verbindung zwischen den Controller-Instanzen herstellen (AppDelegate-Klasse)
Reaktion auf die Auswahl eines Listeneintrags
Beim Start den ersten Eintrag auswählen
Beim Start die Master-Ansicht anzeigen
Zurück-Button für das iPad im Hochformat
Die Master-Detail-Vorlage
17.7 Popups
Hello Popup!
Popups auch auf dem iPhone
Größe des Popups einstellen
Popup-Richtung festlegen
Popups per Code anzeigen und entfernen
SliderViewController
Unwind für Popups
dismiss-Methode
17.8 Ja/Nein-Dialoge (UIAlertController)
18 Hello macOS-World!
18.1 Von iOS zu macOS
Gemeinsamkeiten
Unterschiede
Window- versus View-Controller
18.2 Lottozahlengenerator
Projekt einrichten
Gestaltung der Benutzeroberfläche
Effizient arbeiten mit Kopieren und Einfügen
Fenstergröße und Fenstertitel einstellen
viewDidLoad und representedObject
Outlets und Actions
Die Lotto-Klasse
Die View-Controller-Klasse
Programmende
19 macOS-Grundlagen
19.1 Programme mit mehreren Fenstern
Segues
Datenübergabe mit der Methode prepare
Fenstergröße fixieren
Window-Eigenschaften des Ziel-Controllers einstellen
Ansichten und Fenster schließen
Segues per Code ausführen
Fenster per Code erzeugen
19.2 Tab-View-Controller
Storyboard und Tab-View-Controller-Einstellungen
Dialogblattgröße
Segues
Splitter-Steuerelement
Klassen
Application Defaults mit den User-Defaults verbinden (AppDelegate.swift)
Textgröße aus den User-Defaults lesen (ViewController.swift)
Einstellungen ändern (SettingsGeneralVC.swift)
19.3 Standarddialoge
Nachrichten anzeigen und Ja/Nein-Entscheidungen treffen
Datei- und Verzeichnisauswahl
Schrift einstellen
Farbe einstellen
19.4 Tastatur
Die NSResponder-Klasse
Tastaturereignisse
Beispielprogramm
19.5 Menüs
Die Responder-Kette
Gestaltung der Menüleiste
Responder-Aktionen
Menüaktionen in der AppDelegate-Klasse
Menüaktionen in eigenen View-Klassen
Veränderung von Menüeinträgen per Code
Kontextmenüs
19.6 Programme ohne Menü
Menubar-Apps
Die AppDelegate-Klasse
View-Controller
20 tvOS
20.1 Hello tvOS!
Gestaltung der Benutzeroberfläche
Eigener Code
tvOS-Versionsnummer ermitteln
IP-Adresse ermitteln
Speicherplatz ermitteln
20.2 Fernbedienung auswerten
touches-Ereignisse
Die Tasten der Fernbedienung
presses-Methoden
Gesture Recognizer
20.3 Focus Engine
Eigene Steuerelemente mit Fokus
Beispiel
View-Controller mit didUpdateFocus-Methode
Fokussiertes Element per Code auswählen
Fokus in SpriteKit-Programmen
Teil III Programmier- und Arbeitstechniken
21 Dateien und User-Defaults
21.1 User-Defaults
Beispiel
Interna
21.2 Dateinamen und URLs
Dateinamen in URLs umwandeln
URL in Dateinamen umwandeln
URLs bearbeiten
Testen, ob eine Datei existiert
21.3 Bundle-Dateien und Assets
Zugriff auf Bundle-Dateien
Zugriff auf Bitmap-Dateien
Zugriff auf Farben
21.4 Standardverzeichnisse
Verzeichnisse mit dem File-Manager ermitteln
Heimatverzeichnis
Aktuelles Verzeichnis ermitteln und ändern
Temporäres Verzeichnis
Den Inhalt von Verzeichnissen auflisten
Welches Verzeichnis für welchen Zweck?
21.5 Dateioperationen
Eigenschaften von Dateien ermitteln
Verzeichnistest
Rekursiv die Verzeichnisgröße ermitteln
Dateien kopieren, verschieben und löschen
Textdateien lesen und schreiben
Noch ein Beispiel
21.6 Wie geht’s weiter?
22 Netzwerk, XML und JSON
22.1 Dateien per HTTP/HTTPS laden
Binäre Daten und Bilder
Unsichere Downloads
Downloads im Hintergrund
URLSession-Delegates
GUI-Synchronisierung
22.2 XML-Dokumente auswerten
Die SWXMLHash-Bibliothek
XML-Sitemap lesen
22.3 JSON-Encoder und -Decoder
Hello World, JSON!
JSON-Formatierung
JSON-Decoder
Zuordnung zwischen JSON-Dokument und Swift-Typen ändern
Eigene Encoder und Decoder
Weitere Beispiele und Details
22.4 Webseiten anzeigen
Webseite im Webbrowser anzeigen
Webseite in der App anzeigen
UIWebView-Klasse
WKWebView-Klasse
SFSafariViewController-Klasse
HTTP-Seiten anzeigen
23 Tabellen und Listen darstellen
23.1 Listen in iOS-Apps (UITableView)
Hello UITableView!
Reaktion auf die Auswahl eines Listeneintrags
Listeneintrag per Code auswählen
Anzeige leerer Listeneinträge vermeiden
23.2 Prototypzellen
Listenzellen mit Bild und Zusatzinformationen
Bundesländerliste mit Flaggen
Bundesländerdaten verwalten
Table-View-Code
23.3 Individuelle Gestaltung von Listenzellen
Den Inhalt von Prototypzellen selbst zusammenstellen
Noch mehr Gestaltungsmöglichkeiten mit einer eigenen UITableViewCell-Klasse
Detailansicht zu Listeneinträgen
23.4 Veränderliche Listen
Die Methode reloadData
Edit-Modus
Gestaltung der Benutzeroberfläche
Inhalt neu laden (Pull to Refresh)
Beispiele für veränderliche Listen
23.5 Tabellen in macOS-Apps (NSTableView)
Hello NSTableView!
Table-View mit eigenen Views
Programmaufbau und Country-Klasse
Table-View-Code
Die Tabelle mit Daten füllen
Tabelle sortieren
Auswahl einer Zeile
23.6 Collections asynchron füllen (UICollectionView)
RSS-Datei laden und auswerten (Film-Klasse)
Collection-View verwenden
Collection-View mit Trailer-Daten füllen (ViewController.swift)
Zellenauswahl
24 GPS- und Kompassfunktionen
24.1 Hello MapView!
Um Erlaubnis fragen
Info.plist-Einstellungen
Erste Tests
Kartenfunktionen im iOS-Simulator
Das MapKit-Framework
24.2 Wegstrecke aufzeichnen
Programmaufbau und Auto Layout
Die ViewController-Klasse
Initialisierung in viewDidLoad
locationManager-Delegate
Die mapView-Methode
Erweiterungsmöglichkeiten
24.3 Kompassfunktionen
Kompasskalibrierung
25 Grafik und Animation
25.1 Eigene Steuerelemente mit Grafikfunktionen
Eine Klasse für ein neues Steuerelement
Die draw-Methode
Das neue Steuerelement verwenden
Die UIBezierPath-Klasse
Hintergrundfarbe einstellen
25.2 Kompass-Steuerelement
Die CompassView-Klasse
Hilfsfunktion »with«
Automatischer Redraw bei Größenänderung
Kompassnadel einstellen
Den Kompass an die Ausrichtung des Geräts anpassen
Xcode-Integration mit IBDesignable und IBInspectable
25.3 Core Graphics
Image-Renderer
25.4 Animationen
Hello World!
Fade-in-Effekt
Steuerelemente animiert erscheinen und verschwinden lassen
26 Touch, Maus, Gestures und Drag & Drop
26.1 Touch
Beispiel: Linien zeichnen
MyView-Klasse
26.2 Maus
Koordinatensysteme, Bounds und Frames
Mausposition ergründen
Statustasten
Beispiel: Kreise zeichnen
Die MyView-Klasse
Die draw-Methode
Die mouseDown-Methode
26.3 Gestures
Beispielprogramm
Gesture Recognizer per Code einrichten
26.4 Drag & Drop (macOS)
Drag-Operationen empfangen (NSDraggingDestination)
Drag-Operationen initiieren (NSDraggingSource)
Beispielprogramm
Projektaufbau
View-Controller
Die MyView-Klasse
Drag & Drop initiieren
Drag & Drop-Empfang zulassen
Auswertung der Dragging-Informationen
Drag & Drop-Empfang verarbeiten
26.5 Drag & Drop (iOS)
Überblick
Beispiel 1: Drag & Drop mit Image-Views
Drag initiieren
Drop-Ereignis verarbeiten
Beispiel 2: Drag & Drop mit Table-Views
Initialisierung der Table-Views
Drag initiieren
Drop-Ereignis verarbeiten
27 Audio, Video und Fotos
27.1 Audio-Wiedergabe mit dem AVAudioPlayer
Bibliotheks- und Klassen-Überblick
Audio-Formate
Audio-Dateien mit einem AVAudioPlayer abspielen
Andere Audio-Datei abspielen
Lautstärke einstellen
Abspielposition steuern
Audio-Dateien im Hintergrund spielen
Control-Center-Integration
Systemklänge abspielen
27.2 Audio-Wiedergabe mit dem AVPlayer
AVItems und AVAssets
AVPlayer steuern
27.3 Audio-Wiedergabe mit dem AVPlayerViewController
27.4 Audio-Aufnahmen mit dem AVAudioRecorder durchführen
Erlaubnis einholen
Aufnahme durchführen
Aufnahmelänge anzeigen
Aufnahme stoppen und abspielen
27.5 Videos abspielen
Videos in einer eigenen View abspielen (AVPlayerLayer)
27.6 Videos mit der Picker-View auswählen und aufnehmen
Videos aufnehmen
Temporäres Verzeichnis aufräumen
27.7 YouTube-Videos abspielen
Umweg über einen Web-Viewer
Die youtube-ios-player-helper-Bibliothek
Die YoutubeSourceParserKit-Bibliothek
27.8 Fotos mit der Picker-View auswählen und aufnehmen
Foto aufnehmen
27.9 Fotos in einer AVCaptureSession aufnehmen
Klassenüberblick
Die Beispiel-App
Initialisierung der Capture-Session
Zwischen Rear- und Front-Kamera wechseln
Blitz-Modus umschalten
Endlich ein Foto!
Segues von und zur Bildansicht
Die Bildansicht
27.10 Barcodes in einer AVCaptureSession erkennen
Beispiel
Die Delegate-Methode
28 SpriteKit
28.1 Hello SpriteKit!
»Hello World!« selbst gemacht
UIController- und SKView-Klasse
Sichtbaren Bereich der SKScene-Klasse einstellen
SpriteKit-Apps für das iPhone X
SKSpriteNode-Objekt anzeigen
Räumliche Anordnung von Sprites und anderen Objekten (zPosition)
Farb- und Bitmap-Literale
iOS-Geräteausrichtung steuern, Anzeige des Control Centers unterdrücken
28.2 Sprites erzeugen und bewegen
Bitmaps in Xcassets-Dateien
Sprite-Position und AnchorPoint
Sprite-Aussehen verändern
Sprites ohne Bitmap (ShapeNodes)
Sprites bewegen
Text (LabelNodes)
Organisation der Sprites
28.3 Spielsteuerung durch Touch-Ereignisse
Touch-Ereignisse unter iOS
Zwischen Bewegung (Move) und Berührung (Tap) differenzieren
Touch-Ereignisse unter tvOS
28.4 Bewegungssteuerung (Gyroskop und Accelerometer)
Bildschirmrotation abstellen (Device Orientation)
Bewegungssteuerung unter iOS
Beispiele für iOS
Bewegungssteuerung unter tvOS
28.5 Aktionen
Bewegungsaktionen
Rotationsaktionen
Skalierungsaktionen
Einblend- und Ausblendaktionen
Farbaktionen
Animationsaktionen
Audio-Aktionen
Aktionen kombinieren und wiederholen
Warten, Aktionen wiederholen und rückgängig machen
Sprites löschen
Noch mehr Aktionen, eigene Aktionen
Aktionen pausieren bzw. stoppen
28.6 Der Game-Loop
28.7 Kollisionserkennung
Kollisionserkennung selbst gemacht
Kollisionserkennung mit SpriteKit
Das SKPhysicsContactDelegate-Protokoll
Die SKPhysicsBody-Klasse
Objektkategorien für die Kollisionserkennung
Einschub: physicsBody-Eigenschaften mit weniger Tippaufwand einstellen
Reaktion auf Kollisionen
28.8 Minispiel: Luftballone abschießen
Code-Aufbau
Initialisierung
Pfeile abschießen
Ballone starten
Treffer feststellen
28.9 Physik
Einschränkungen und Probleme
Hello Physics!
Body versus Edge
SKPhysicsBody-Eigenschaften
SKPhysicsWorld-Eigenschaften
28.10 Minispiel: Pyramide zerstören
Code-Aufbau
Initialisierung
Kanonenkugel verschießen
28.11 Scene-Editor
Szenen einrichten
Szenenwechsel
Szenengröße einstellen
Arbeiten im Scene-Editor
28.12 Partikel-Emitter
29 iCloud
29.1 iCloud-Grundlagen
Key/Value-Speicher
CloudKit
iCloud Drive
Sonstige iCloud-Nutzungsvarianten
Argumente für die iCloud
Einschränkungen
iCloud-Tests und -Debugging
Sicherheit
29.2 Key/Value-Speicher
Hello World, iCloud!
Beispiel: Hintergrundfarbe synchronisieren
29.3 CloudKit-Grundlagen
Nomenklatur
Dashboard
Dokumentation
29.4 CloudKit-Programmiertechniken
iCloud-Login überprüfen
Datensatz speichern
Datensatz mit Asset speichern
Referenzen
Datensätze auslesen
Suchkritierien (NSPredicate)
Abfrageergebnisse sortieren
Benutzer-ID und -Namen feststellen
29.5 CloudKit-Beispiel
Datenbankschema
Aufbau des Projekts
Book-Struktur
Review-Struktur
Startansicht der App (ViewController-Klasse)
Rezensionszelle (ReviewCell-Klasse)
Rezensions-View (ReviewsVC-Klasse)
View zur Eingabe einer neuen Rezension (NewReviewVC-Klasse)
30 Asynchrone Programmierung
30.1 Hello Grand Central Dispatch!
30.2 GCD-Grundlagen
Dispatch-Queues
Quality of Service
Jobs gruppieren
Jobs erst später ausführen
Methoden regelmäßig ausführen
Zeit verstreichen lassen
Jobs abbrechen
Objektzugriff synchronisieren
GCD-Tests in Terminal-Apps (macOS)
Mehr Beispiele
30.3 Parallel rechnen
Outlets und synchronisierte Variablen
Berechnung asynchron starten und stoppen
Teilberechnung durchführen (calc-Methode)
Endergebnis anzeigen (done-Methode)
Synchrone Berechnung
Benchmarkergebnisse
30.4 Die Async-Bibliothek
31 App Store und Co.
31.1 iOS-Artwork (Icons, Launch Screen)
App-Icon
Startansicht (Launch Screen)
App-Name
31.2 macOS-Artwork (Icon)
31.3 tvOS-Artwork (Parallax-Icons, Launch und Top Shelf Image)
Der Parallax-Effekt
Eigene Parallax-Icons
Parallax-Icons in GIMP erstellen
Parallax-Icons in Xcode
Der Parallax Previewer
Launch Image
Top Shelf Image
31.4 Mehrsprachige Apps
Localization versus Internationalization
Defaulteinstellungen in Xcode
Deutsch als primäre Sprache einstellen
Sprache hinzufügen
Lokalisierungsdateien exportieren
Lokalisierungsdateien bearbeiten
Übersetzte Dateien wieder importieren
Die App in verschiedenen Lokalisierungen ausprobieren
Internationalisierung im Code
31.5 Eigene Apps im App Store anbieten
App-Store-Regeln
Bundle-ID und Signing-Einstellungen (Xcode)
App-ID erzeugen (Apple Developer)
App einrichten (iTunes Connect)
App-Daten ausfüllen (iTunes Connect)
App-Upload (Xcode)
App-Prüfung initiieren (iTunes Connect)
Warten auf das Okay von Apple
Abgelehnte App neuerlich einreichen
Neue Version einreichen
31.6 macOS-Programme selbst weitergeben
Gatekeeper
Programme signieren und archivieren
Programme in einem DMG-Image verpacken
32 Xcode-Arbeitstechniken
32.1 Simulator-Ausgaben stoppen
32.2 Header-Code einer eigenen Klasse erzeugen
32.3 Versionsverwaltung mit Git
Git aktivieren
32.4 Crashlogs
32.5 Refactoring
32.6 Projekte umbenennen
32.7 Xcode-Verzeichnisse aufräumen
DerivedData-Verzeichnis
iOS-DeviceSupport-Verzeichnis
CoreSimulator-Verzeichnis
Time-Machine-Optionen
Ergebnisse
32.8 Apple Configurator
33 Server-side Swift
33.1 Swift unter Linux
Hello World unter Ubuntu
Hello World in einem Docker-Container
Bibliotheken
Swift Package Manager
33.2 Vapor kennenlernen
Installation unter macOS
Installation unter Ubuntu
Wieder »Hello World!«
Die erste REST-API
Der erste eigene Server-Code
Zurück in Xcode
Vapor und Docker
33.3 Die Vapor-Toolbox
33.4 Vapor-Grundlagen
Droplets
Konfiguration (Config-Klasse)
Routing
Fehler auslösen (Abort-Struktur)
Request-Klasse
JSON
REST-Beispiel (To-do-Liste)
33.5 Datenbankanbindung mit Fluent
Datenbankmodell erstellen (Model-Protokoll)
Fluent-Features
REST-API mit Routing-Closures
REST-API mit einem Controller realisieren (ResourceRepresentable-Protokoll)
Tabellen einrichten
SQLite-Provider verwenden
MySQL-Provider verwenden
33.6 Authentifizierung und Autorisierung
Authentifizierung in Vapor
To-do-Server-App mit Authentifizierung
To-do-Controller
Routing
33.7 Deployment
App einrichten
Proxy-Konfiguration für Apache
Automatischer Start der Vapor-App (systemd-Service)
Test und Client-App
Vapor Cloud
Teil IV Beispielprojekte
34 New-York-Times-Bestseller
34.1 New-York-Times-API
JSON-Datenmodell
Bestsellerliste lesen
34.2 Benutzeroberfläche
Weiße Streifen verhindern
Haupt-View-Controller-Code
Detail-View-Controller-Code
Erweiterungsideen
34.3 Split-View-Variante
Detailansicht mit WKWebView (DetailVC-Klasse)
Listenansicht (MasterTVC-Klasse)
35 To-do-Listen
35.1 Gestaltung der Benutzeroberfläche
Auto Layout
35.2 Datenmodell
35.3 View-Controller-Klasse
Button- und Gesture-Methoden
Popup-Dialog anzeigen
Listeneintrag hinzufügen oder ändern
DataSource-Methoden
35.4 Popup-View-Controller-Klasse
35.5 iCloud-Variante
Todo-Klasse
View-Controller-Klasse
AppDelegate-Klasse
36 Schatzsuche
36.1 Aufbau der App
Aufbau und Storyboard
Layoutregeln
Funktion zur Darstellung geografischer Daten
Projekteinstellungen
36.2 Datenmodell
Protokolle
Array speichern und wieder einlesen (JSONEncoder/-Decoder)
36.3 Location Manager selbst gemacht
Die Init-Funktion
Kommunikation über das Notification Center
36.4 Steuerelement zur Richtungsanzeige (UIBezierPath)
36.5 Hauptansicht mit Listenfeld
Outlets, Eigenschaften und Initialisierung
DataSource-Anbindung
Segues vom und zum Speichern-Popup, neuen Eintrag speichern
Segue vom und zum Detaildialog
36.6 Popup-Dialog zum Speichern
36.7 Detailansicht mit Richtungspfeil
Auto Layout
Initialisierung der Controller-Klasse
Abstand und Richtung zum Zielpunkt errechnen
Listeneintrag löschen bzw. ändern
37 Währungskalkulator
37.1 App-Überblick
Storyboard und Klassen
Auto Layout in der Umrechnungsansicht
Auto Layout in der Einstellungsansicht
Bildkataloge
Erweiterungsmöglichkeiten
37.2 Kurse ermitteln
XML-Datei herunterladen
XML-Daten auswerten
37.3 Das Datenmodell der App
Init-Funktion
Wechselkurse im Cache-Verzeichnis speichern
Kursumrechnung
Länderkürzel aus Währungskürzeln extrahieren
37.4 Umrechnungsansicht
Property Observer für die Währungskürzel
Initialisierung in viewDidLoad
Das CurCalc-Objekt initialisieren und das Datum der Kurse anzeigen
Ungültige Tastatureingaben vermeiden
Tap Gesture Recognizer (Tastatur ausblenden)
Währungsumrechnung bei der Texteingabe
37.5 Einstellungsansicht
Picker-Views (UIPickerView-Klasse)
Outlets, Eigenschaften und viewDidLoad
Picker-View mit Daten füllen
Auswahl eines Picker-View-Elements
37.6 Internationalisierung und Lokalisierung
38 Fünf Gewinnt
38.1 Die App »Fünf Gewinnt«
Hintergründe zum Spiel
Programmaufbau
Storyboard und Auto-Layout-Regeln
38.2 Enumerationen und globale Funktionen (Globals.swift)
Feld- und Spielstatus (Piece und GameStatus)
Spielbrettgrößen (BoardSize)
2D-Arrays erzeugen
Farben aufhellen bzw. abdunkeln
Rechteck rund um einen Mittelpunkt erzeugen
Code verzögert ausführen
38.3 Die Spiellogik (FiveWins.swift)
Spielfeld speichern
Zug ausführen und rückgängig machen
Sieg-Test
Der Spielalgorithmus
Den Wert einer Linie berechnen
Den Wert aller Linien berechnen
Den Wert eines Spielfelds berechnen
Den besten Zug auswählen
38.4 Darstellung des Spielbretts und der Steine (BoardView.swift)
Eigenschaften
Reset
Spielbrett zeichnen
Zug ausführen
Einen Spielstein als (animierte) View darstellen
Steine neu positionieren
Benutzereingaben feststellen und weiterleiten
38.5 Steuerung des Spielablaufs (ViewController.swift)
Ein neues Spiel starten
Warten auf den nächsten Zug
Aktualisierung des Labels und der Statusvariablen
Undo
Popup-Aufruf
38.6 Der Popup-Dialog (PopupVC.swift)
Neues Spiel starten, Zug rückgängig machen
Einstellungen ändern
38.7 Erweiterungsmöglichkeiten
Spielstand automatisch speichern
Spielstärke
Animationen und Audio-Effekte
Optische Gestaltung
Geld verdienen
39 Icon-Resizer
39.1 App-Überblick
Programmaufbau
Das Split-View-Steuerelement
Layoutregeln für das Hauptfenster
Popup-Menü
Sandbox-Einstellungen
Erweiterungsmöglichkeiten
39.2 Icons verwalten (IconSize-Struktur)
Enumerationen
IconSize-Struktur
Initialisierung von IconSize-Arrays
Bitmaps skalieren
Bitmaps im PNG-Format speichern
39.3 Hauptfenster (ViewController.swift)
viewDidLoad mit dem Aufruf von unregisterDraggedTypes
Popup- und Speicher-Buttons, Programmende
Split-View-Delegation
Table-View-Datenquelle
39.4 Drag & Drop-Quelle für Icons (IconCellView.swift)
39.5 Drag & Drop-Empfänger für Icons (OriginalIconView.swift)
Drag & Drop einer Bilddatei empfangen
Dateiauswahldialog für die Bilddatei
39.6 Popup-Menü (IconChoiceVC.swift)
39.7 Temporäres Verzeichnis erstellen und löschen
Ein eigenes temporäres Verzeichnis einstellen
Temporäres Verzeichnis löschen
40 Breakout
40.1 Programmaufbau
SpriteKit-Funktionen
Erweiterungsideen
40.2 Initialisierung
Control Center verbergen
Statusvariablen
Initialisierung der Spielszene
Spielsteine einrichten
Schläger einrichten (Paddle)
Ball einrichten
40.3 Spielsteuerung
Schläger steuern
Test, ob der Ball im Aus ist
Kollisionserkennung
41 Pac-Man selbst gemacht
41.1 Programmaufbau
Code
Bitmaps (Xcassets)
41.2 Der Tile-Editor »Tiled«
Eine neue Karte einrichten
Tilesets
Karten zeichnen
Terrains und andere Funktionen
Zusammenspiel mit Xcode
41.3 Globale Konstanten, Datenstrukturen und Enumerationen
Rechnen mit CGFloat
Monsterfarben
Spielstatus
Spiel-Level
Dies und das
41.4 Initialisierung des Spiels
startLevel-Funktion
GameScene-Initialisierung
41.5 Die Maze-Klasse
Klassenvariablen und Eigenschaften
Init-Funktion der Maze-Klasse
41.6 Aufbau der Spielszene (setup-Methoden)
setupWallsAndDots
setupPlayer
setupMonsters
setupLabel und setupLives
41.7 Spielsteuerung (touch-Methoden)
Die touchesBegan-Methode
Die touchesMoved-Methode
Die touchesEnded-Methode
Die startGame-Methode
Die nextLive-Methode
41.8 Bewegung des Pac-Mans
Die update-Methode
Die updatePlayer-Methode
Die movePlayer-Methode
Die adjustPlayerPositionToGrid-Methoden
41.9 Steuerung der Monster
Monster zufällig bewegen
Jagdmodus
Fluchtmodus
41.10 Kollisionen
Punkt gefressen
Diamant gefressen
Zusammenstoß mit einem Monster
41.11 Apple-TV-Variante von Pac-Man
Neues Target einrichten
Projektorganisation
tvOS-spezifischer Code
41.12 Pac-Man-Figuren zeichnen
42 Asteroids
42.1 Programmaufbau
42.2 Globale Konstanten und Funktionen
42.3 Programmstart und Tastaturereignisse (GameViewController)
Programmstart
Einstellungsdialog anzeigen
Reaktion auf die Tasten der Fernbedienung
Fokus-Engine für den Einstellungsdialog aktivieren
42.4 Initialisierung des Spiels (GameScene)
Eigenschaften
Geräusche
didMove-Methode
Hintergrundgestaltung
Raumschiff
Einen Asteroiden starten
42.5 Spielablauf (ebenfalls in GameScene)
Steuerung des Raumschiffs durch das Touchpad
Gyroskop-Steuerung (update-Methode)
Raketen abschießen
Kollisionserkennung
Spielende
42.6 Fokussierbare Menütexte (MyLabel)
42.7 Der Einstellungsdialog (MainScene)
Initialisierungsarbeiten
Ereignisverwaltung
Bildschirmdarstellung je nach ausgewähltem Spielmodus
Stichwortverzeichnis
Rechtliche Hinweise
Über den Autor
← Prev
Back
Next →
← Prev
Back
Next →