Schnell von Grund auf Vererbung und Protokolle

Wenn Sie die vorherigen Lektionen dieser Serie gelesen haben, sollten Sie die Grundlagen der Programmiersprache Swift bereits gut verstanden haben. Wir haben über Variablen, Konstanten und Funktionen gesprochen, und in der vorherigen Lektion haben wir die Grundlagen der objektorientierten Programmierung in Swift behandelt.

Während Spielplätze ein großartiges Werkzeug sind, um mit Swift zu spielen und die Sprache zu lernen, ist es an der Zeit, unser erstes Swift-Projekt in Xcode zu erstellen. In dieser Lektion erstellen wir mit Xcode und Swift die Grundlage für eine einfache To-Do-Anwendung. Auf dem Weg werden wir mehr über objektorientierte Programmierung erfahren und die Integration von Swift und Objective-C näher betrachten.

Voraussetzungen

Wenn Sie mit mir folgen möchten, stellen Sie sicher, dass Xcode 8.3.2 oder höher auf Ihrem Computer installiert ist. Xcode 8.3.2 ist im App Store von Apple erhältlich.

1. Projekteinrichtung

Schritt 1: Wählen Sie eine Vorlage

Starten Sie Xcode 8.3.2 oder höher und wählen Sie Neu> Projekt… von dem Datei Speisekarte. Von dem iOS Abschnitt, wählen Sie die Einzelansicht-Anwendung Vorlage und klicken Sie auf Nächster.

Schritt 2: Konfigurieren Sie das Projekt

Nennen Sie das Projekt Machen und setzen Sprache zu Schnell. Stelle sicher Geräte ist eingestellt auf iPhone und die Kontrollkästchen am unteren Rand sind nicht markiert. Klicken Nächster weitermachen.

Teilen Sie Xcode mit, wo Sie Ihr Projekt speichern möchten, und klicken Sie auf Erstellen unten rechts, um Ihr erstes Swift-Projekt zu erstellen.

2. Projektanatomie

Bevor wir unsere Reise nach Swift fortsetzen, nehmen wir uns einen Moment Zeit, um zu sehen, was Xcode für uns geschaffen hat. Wenn Sie mit Xcode und iOS noch nicht vertraut sind, werden die meisten davon für Sie neu sein. Durch die Arbeit mit einem Swift-Projekt erhalten Sie jedoch ein besseres Gefühl dafür, wie Klassen und Strukturen aussehen und wie sie sich in Swift verhalten.

Die Projektvorlage unterscheidet sich nicht wesentlich von einem Projekt, das mit Objective-C als Programmiersprache erstellt wurde. Die wichtigsten Unterschiede beziehen sich auf die AppDelegate und ViewController Klassen.

Wenn Sie in der Vergangenheit mit Objective-C gearbeitet haben, werden Sie feststellen, dass die Projektvorlage weniger Dateien enthält. Es gibt keine Kopfzeile (.h) oder Umsetzung (.m) Dateien, die in unserem Projekt gefunden werden sollen. In Swift haben Klassen keine separate Header-Datei, in der die Schnittstelle deklariert ist. Stattdessen wird eine Klasse in einer einzigen Klasse deklariert und implementiert .schnell Datei.

Unser Projekt enthält derzeit zwei Swift-Dateien, eine für die AppDelegate Klasse, AppDelegate.swift, und noch eine für die ViewController Klasse, ViewController.swift. Das Projekt umfasst auch zwei Storyboards, Hauptplatine und LaunchScreen.storyboard. Wir werden später in dieser Lektion mit dem Haupt-Storyboard arbeiten. Es enthält momentan nur die Szene für ViewController Klasse.

Das Projekt enthält noch einige andere Dateien und Ordner, die wir jedoch vorerst ignorieren. Sie spielen im Rahmen dieser Lektion keine wichtige Rolle.

3. Vererbung

Das erste, was wir in dieser Lektion ansprechen werden, ist Vererbung, ein allgemeines Paradigma der objektorientierten Programmierung. In Swift können nur Klassen von einer anderen Klasse erben. Mit anderen Worten, Strukturen und Aufzählungen unterstützen keine Vererbung. Dies ist einer der Hauptunterschiede zwischen Klassen und Strukturen.

Öffnen ViewController.swift Vererbung in Aktion zu sehen. Die Schnittstelle und Implementierung der ViewController klasse ist ziemlich nackt, was es uns leichter macht, uns auf das Wesentliche zu konzentrieren.

UIKit

Oben ViewController.swift, Sie sollten eine Importanweisung für das UIKit-Framework sehen. Denken Sie daran, dass das UIKit-Framework die Infrastruktur zum Erstellen einer funktionsfähigen iOS-Anwendung bietet. Mit der Import-Anweisung oben steht uns diese Infrastruktur in zur Verfügung ViewController.swift.

UIKit importieren

Superklasse

Unter der import-Anweisung definieren wir eine neue Klasse mit dem Namen ViewController. Der Doppelpunkt nach dem Klassennamen wird nicht in übersetzt ist vom Typ wie wir früher in dieser Serie gesehen haben. Stattdessen ist die Klasse nach dem Doppelpunkt die Oberklasse von ViewController Klasse. Mit anderen Worten könnte der folgende Ausschnitt als gelesen werden Wir definieren eine Klasse mit dem Namen ViewController das erbt von UIViewController.

Klasse ViewController: UIViewController 

Dies erklärt auch das Vorhandensein der Importanweisung oben in ViewController.swift seit der UIViewController Klasse wird im UIKit-Framework definiert.

Überschreibungen

Das ViewController Die Klasse enthält derzeit zwei Methoden. Beachten Sie jedoch, dass jeder Methode das vorangestellte vorangestellt ist überschreiben Stichwort. Dies zeigt an, dass die Methoden in der Oberklasse der Klasse (oder höher in der Vererbungsstruktur) definiert sind und von der überschrieben werden ViewController Klasse.

class ViewController: UIViewController override func viewDidLoad () super.viewDidLoad () überschreibt func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Das überschreiben Konstrukt existiert nicht in Objective-C. In Objective-C implementieren Sie eine überschriebene Methode in einer Unterklasse, ohne explizit anzugeben, dass sie eine Methode überschreibt, die in der Vererbungsstruktur höher ist. Die Objective-C-Laufzeit erledigt den Rest.

Dasselbe gilt für Swift, die überschreiben Schlüsselwörter sorgen für mehr Sicherheit beim Überschreiben von Methoden. Weil wir das vorangestellt haben viewDidLoad () Methode mit der überschreiben Stichwort, schnell erwartet Diese Methode in der Oberklasse der Klasse oder höher in der Vererbungsstruktur. Einfach ausgedrückt: Wenn Sie eine Methode überschreiben, die nicht im Vererbungsbaum vorhanden ist, gibt der Compiler einen Fehler aus. Sie können dies testen, indem Sie das falsch schreiben viewDidLoad () Methode wie unten gezeigt.

4. Benutzeroberfläche

Outlets deklarieren

Fügen wir dem Ansichtscontroller eine Tabellenansicht hinzu, um eine Liste der Aufgabenelemente anzuzeigen. Bevor wir das tun, müssen wir einen Auslass für die Tabellenansicht erstellen. Ein Outlet ist nichts anderes als eine Eigenschaft, die für den Interface Builder sichtbar ist und eingestellt werden kann. Um eine Steckdose in der ViewController Klasse setzen wir der Eigenschaft, einer Variablen, die @IBOutlet Attribut.

Klasse ViewController: UIViewController @IBOutlet var tableView: UITableView! Überschreiben von func viewDidLoad () super.viewDidLoad () Überschreiben von func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Beachten Sie, dass der Auslass eine implizit nicht verpackte Option ist. Ein Was? Lassen Sie mich zunächst sagen, dass eine Steckdose immer ein optionaler Typ sein muss. Der Grund ist einfach. Jede Eigenschaft der ViewController Klasse muss nach der Initialisierung einen Wert haben. Eine Steckdose ist jedoch erst zur Laufzeit nach dem mit der Benutzeroberfläche verbunden ViewController Instanz wurde initialisiert, daher der optionale Typ.

Warte eine Minute. Das Tabellenansicht outlet wird als implizit nicht verpackt, nicht als optional deklariert. Kein Problem. Wir können das erklären Tabellenansicht Auslass als Option, indem das Ausrufezeichen im obigen Snippet durch ein Fragezeichen ersetzt wird. Das würde gut passen. Dies würde jedoch auch bedeuten, dass wir die Eigenschaft jedes Mal explizit auspacken müssen, wenn wir auf den im optionalen Wert gespeicherten Wert zugreifen möchten. Dies würde schnell umständlich und ausführlich werden.

Stattdessen erklären wir das Tabellenansicht outlet als implizit nicht umschlossenes optionales Element. Das bedeutet, dass das optionale Element nicht explizit entpackt werden muss, wenn wir auf seinen Wert zugreifen müssen. Kurz gesagt, eine implizit nicht verpackte Option ist optional, aber wir können auf den in der Option gespeicherten Wert wie eine reguläre Variable zugreifen. Beachten Sie, dass Ihre Anwendung abstürzt, wenn Sie versuchen, auf ihren Wert zuzugreifen, wenn noch kein Wert festgelegt wurde. Das ist das Problem. Wenn die Steckdose richtig angeschlossen ist, können wir jedoch sicher sein, dass die Steckdose eingestellt ist, wenn wir zum ersten Mal versuchen, auf sie zuzugreifen.

Steckdosen anschließen

Wenn die Steckdose deklariert ist, ist es Zeit, sie im Interface Builder anzuschließen. Öffnen Hauptplatine, und wählen Sie den View Controller. Wählen Einbetten in> Navigationscontroller von dem Editor Speisekarte. Dadurch wird der View Controller als Root-View-Controller eines Navigationscontrollers festgelegt. Mach dir jetzt keine Sorgen.

Ziehen Sie eine UITableView Beispiel aus dem Objektbibliothek zur Ansicht des View-Controllers und fügen Sie die erforderlichen Layoutbeschränkungen hinzu. Öffnen Sie bei ausgewählter Tabellenansicht die Verbindungsinspektor und legen Sie die Tabellenansicht fest Datenquelle und delegieren Ausgänge an den View Controller.

Mit dem Verbindungsinspektor noch offen, wählen Sie den View Controller aus und verbinden Sie das Tabellenansicht Ausgang zur Tabellenansicht haben wir gerade hinzugefügt. Das verbindet die Tabellenansicht Auslauf der ViewController Klasse in die Tabellenansicht.

5. Protokolle

Bevor wir die Anwendung erstellen und ausführen können, müssen wir das implementieren UITableViewDataSource und UITableViewDelegate Protokolle in der ViewController Klasse. Dies beinhaltet mehrere Dinge.

Schritt 1: Konformität mit Protokollen

Wir müssen dem Compiler mitteilen, dass das ViewController Klasse entspricht der UITableViewDataSource und UITableViewDelegate Protokolle. Die Syntax sieht ähnlich aus wie in Objective-C.

Klasse ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate …

Die Protokolle, denen die Klasse entspricht, werden nach der Oberklasse aufgeführt, UIViewController im obigen Beispiel. Wenn eine Klasse keine Superklasse hat, was in Swift nicht ungewöhnlich ist, werden die Protokolle unmittelbar nach dem Klassennamen und dem Doppelpunkt aufgelistet.

Schritt 2: Implementieren der UITableViewDataSource Protokoll

Weil der UITableViewDelegate Protokoll definiert nicht die erforderlichen Methoden, wir implementieren nur die UITableViewDataSource Protokoll für jetzt. Bevor wir dies tun, erstellen wir eine variable Eigenschaft, um die zu erledigenden Aufgaben in der Tabellenansicht zu speichern.

Klasse ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate @IBOutlet var tableView: UITableView! var items: [String] = []…

Wir deklarieren eine variable Eigenschaft Artikel vom Typ [Zeichenfolge] und setzen Sie ein leeres Array, [], als Anfangswert. Das sollte jetzt bekannt vorkommen. Als nächstes implementieren wir die zwei erforderlichen Methoden von UITableViewDataSource Protokoll.

Die erste erforderliche Methode, numberOfRows (inSection :), ist einfach. Wir geben einfach die Anzahl der Artikel zurück, die im gespeichert sind Artikel Eigentum.

func tableView (_ tableView: UITableView, numberOfRowsInSection-Abschnitt: Int) -> Int return items.count

Die zweite erforderliche Methode, cellForRow (um :), braucht eine Erklärung. Mit der Subscript-Syntax fragen wir Artikel für den Artikel, der der aktuellen Zeile entspricht.

func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Element abrufen lassen item = items [indexPath.row] // Dequeue Cell let cell = tableView.dequeueReusableCell (withIdentifier: "TableViewCell", für: indexPath) // Zelle konfigurieren cell.textLabel? .Text = Elementrückgabezelle

Wir fragen dann die Tabellensicht nach einer Zelle mit Kennung "TableViewCell", Übergeben des Indexpfads für die aktuelle Zeile. Beachten Sie, dass wir die Zelle in einer Konstanten speichern, Zelle. Es besteht keine Notwendigkeit zu erklären Zelle als Variable.

In der nächsten Codezeile konfigurieren wir die Tabellensichtzelle und setzen den Text der Beschriftung mit dem Wert von Artikel. Beachten Sie, dass in Swift die textLabel Eigentum von UITableViewCell wird als optionaler Typ deklariert, daher das Fragezeichen. Diese Codezeile könnte als gelesen werden Setze die Beschriftung des Textes Text Eigentum an Artikel ob textLabel ist ungleich zu Null. Mit anderen Worten, das Textetikett Text Eigenschaft wird nur gesetzt, wenn textLabel ist nicht Null. Dies ist ein sehr komfortables Sicherheitskonstrukt in Swift, bekannt als optionale Verkettung.

Schritt 3: Zellwiederverwendung

Es gibt zwei Dinge, die wir vor dem Erstellen der Anwendung herausfinden müssen. Zuerst müssen wir der Tabellensicht mitteilen, dass sie die verwenden muss UITableViewCell Klasse, um neue Tabellenansicht-Zellen zu erstellen. Wir machen dies durch Aufruf registerClass (_: forCellReuseIdentifier :), vorbei in der UITableViewCell Klasse und die zuvor verwendete Wiederverwendungskennung, "TableViewCell". Aktualisieren Sie die viewDidLoad () Methode wie unten gezeigt.

override func viewDidLoad () super.viewDidLoad () // Klasse für Cell Reuse tableView.register registrieren (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

Schritt 4: Elemente hinzufügen

Derzeit haben wir keine Elemente in der Tabellenansicht. Dies wird leicht durch das Auffüllen von gelöst Artikel Eigenschaft mit ein paar Aufgaben. Es gibt mehrere Möglichkeiten, dies zu erreichen. Ich habe mich entschieden, die zu bevölkern Artikel Eigentum in der viewDidLoad () Methode wie unten gezeigt.

override func viewDidLoad () super.viewDidLoad () // Elemente ausfüllen = "[Buy Milk", "Tutorial beenden", "Minecraft spielen"] // Klasse für Cell Reuse registrieren tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

6. Erstellen und ausführen

Es ist an der Zeit, unsere Bewerbung für eine Runde zu nehmen. Wählen Lauf von Xcode's Produkt Menü oder drücken Sie Befehl-R. Wenn Sie mitverfolgt haben, sollten Sie das folgende Ergebnis erhalten.

Beachten Sie, dass ich einen Titel hinzugefügt habe, Machen, oben in der Ansicht in der Navigationsleiste. Sie können dasselbe tun, indem Sie das einstellen Titel Eigentum der ViewController Beispiel in der viewDidLoad () Methode.

override func viewDidLoad () super.viewDidLoad () // Set title title = "To Do" // Elemente auffüllen = ["Buy Milk", "Lernprogramm beenden", "Minecraft spielen"] // Klasse für Zellwiederverwendung registrieren tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

Fazit

Obwohl wir gerade eine einfache Anwendung erstellt haben, haben Sie viele neue Dinge gelernt. Wir haben Vererbung und Überschreibungsmethoden untersucht. Wir behandelten auch Protokolle und wie man das übernimmt UITableViewDataSource Protokoll in der ViewController Klasse. Das Wichtigste, was Sie jedoch gelernt haben, ist die Interaktion mit Objective-C-APIs.

Es ist wichtig zu verstehen, dass die APIs des iOS SDK in Objective-C geschrieben sind. Swift wurde so entwickelt, dass es mit diesen APIs kompatibel ist. Aufgrund früherer Fehler wusste Apple, dass Swift in das iOS SDK einbinden konnte, ohne jede einzelne API in Swift neu schreiben zu müssen.

Die Kombination von Objective-C und Swift ist möglich, aber es gibt einige Einschränkungen, die wir im weiteren Verlauf genauer untersuchen werden. Da sich Swift unnachgiebig auf die Sicherheit konzentriert, müssen wir von Zeit zu Zeit einige Hürden nehmen. Keine dieser Hürden ist jedoch zu groß, wie wir in der nächsten Lektion erfahren werden, in der wir weiter an unserer To-Do-Anwendung arbeiten.

In der Zwischenzeit können Sie einige unserer anderen Kurse und Tutorials zur Entwicklung von iOS in Swift Language ausprobieren!