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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
UITableViewDataSource
ProtokollWeil 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.
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")
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")
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")
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!