Laden Sie Ihre kostenlose Kopie von
The Missing Manual
for Swift Development

Der Leitfaden herunter, den ich gerne hätte, als ich anfing

Schließen Sie sich mehr als 20.000 Entwicklern an, die mehr über Swift-Entwicklung erfahren

Laden Sie Ihre kostenlose Kopie herunter

Wenn Sie sich das ansehen, gehen Sie davon aus, dass Sie mit Swift-Erweiterungen vertraut sind. Mit einer Swift-Erweiterung können Sie einem Typ, einer Klasse, einer Struktur, einer Enumeration oder einem Protokoll Funktionen hinzufügen. Aber Erweiterungen sind mächtiger als das. In dieser Episode möchte ich Ihnen vier clevere Verwendungen von Swift-Erweiterungen zeigen.

Protokollkonformität

Die Swift-Programmiersprache erwähnt, dass Erweiterungen verwendet werden können, um einen vorhandenen Typ an ein Protokoll anzupassen. Dies ist zwar nicht neu oder revolutionär, kann Ihnen aber auch dabei helfen, Ihren Code zu organisieren.

Nehmen Sie die Protokolle UITableViewDataSource und UITableViewDelegate als Beispiel. Dieses Beispiel mag bekannt vorkommen. Dies ist in Ordnung, führt jedoch zu einer langwierigen Klassenimplementierung, die im Laufe der Zeit schwierig zu navigieren sein kann.

import UIKitclass ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { ...}

Sie können Ihren Code organisieren, indem Sie für jedes Protokoll, dem der Typ entspricht, eine Erweiterung erstellen.

import UIKitclass ViewController: UIViewController { ...}extension ViewController: UITableViewDataSource { ...}extension ViewController: UITableViewDelegate { ...}

Das Navigieren in Quelldateien wird auch einfacher, wenn Sie es sich zur Gewohnheit machen, die Sprungleiste oben im Quellcode-Editor von Xcode zu verwenden.

Das Navigieren in Quelldateien wird auch einfacher, wenn Sie es sich zur Gewohnheit machen, die Sprungleiste oben im Quellcode-Editor von Xcode zu verwenden.

Preserving Initializers

Den nächsten Trick habe ich von Chris Eidhof gelernt. Für dieses Beispiel müssen wir zuerst eine Struktur definieren, Person. Die Struktur definiert zwei konstante Eigenschaften vom Typ String, first und last.

struct Person { // MARK: - Properties let first: String let last: String}

Swift erstellt großzügig einen Initialisierer für uns, init(first:last:) , mit dem wir eine Instanz der Person -Struktur instanziieren können. Das ist nicht neu.

let john = Person(first: "John", last: "Doe")

Leider ist der Initialisierer nicht mehr verfügbar, wenn wir einen benutzerdefinierten Initialisierer in der Definition der Struktur definieren.

struct Person { // MARK: - Properties let first: String let last: String // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

 Der Initialisierer ist nicht mehr verfügbar, wenn wir in der Strukturdefinition einen benutzerdefinierten Initialisierer definieren.

Glücklicherweise haben wir eine einfache Problemumgehung, um dieses Problem zu beheben. Wir erstellen eine Erweiterung für die Struktur Person, in der wir den benutzerdefinierten Initialisierer definieren.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

 Eine Erweiterung löst das Problem.

Codetrennung

Wir können das vorherige Beispiel noch einen Schritt weiterführen. Vor einigen Jahren skizzierte Natasha Murashev eine Technik, die Erweiterungen verwendet, um den Zustand vom Verhalten zu trennen. Wenn wir diese Technik auf das vorherige Beispiel anwenden, erhalten wir so etwas.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" } // MARK: - Public API var asDictionary: { return }}

Die Typdefinition definiert nur die gespeicherten Eigenschaften. Eine Erweiterung wird für das Verhalten des Typs erstellt, dh Methoden und berechnete Eigenschaften. Das Ergebnis ist eine klare Trennung von Zustand (gespeicherte Eigenschaften) und Verhalten (Methoden und berechnete Eigenschaften).

Wir können noch einen Schritt weiter gehen, indem wir eine zweite private Erweiterung für privates Verhalten erstellen.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { ...}private extension Person { ...}

Die Trennung und Organisation von Code ist mithilfe von Erweiterungen sehr einfach. Ich benutze es die ganze Zeit. Wenn Sie die Header-Dateien von Objective-C vermissen, ist dies eine gute Alternative.

Verschachtelte Typen

In der Programmiersprache Swift wird erwähnt, dass Sie mit Erweiterungen auch verschachtelte Typen definieren und verwenden können. Aber ich denke, diese Funktion wird unterbewertet. Ich benutze es in jedem Swift-Projekt, um zum Beispiel Konstanten zu definieren.

Vor einigen Monaten habe ich ein Tutorial zum Erstellen eines benutzerdefinierten Steuerelements mit einer Bitmaske veröffentlicht. In diesem Tutorial speichern wir den Rohwert der Bitmaske in der Benutzerstandarddatenbank.

// MARK: - [email protected] func scheduleDidChange(_ sender: SchedulePicker) { // Helpers let userDefaults = UserDefaults.standard // Store Value let scheduleRawValue = sender.schedule.rawValue userDefaults.set(scheduleRawValue, forKey: UserDefaults.Keys.schedule)}

Anstelle eines String-Literals verwenden wir eine Konstante. Wir erstellen eine Erweiterung für die Klasse UserDefaults, in der wir eine Enumeration ohne Fälle definieren, Keys. Die Enumeration definiert eine statische Konstante vom Typ String, schedule .

extension UserDefaults { enum Keys { static let schedule = "schedule" }}

Das Ergebnis ist ziemlich schön, wenn Sie mich fragen. Wir können nicht nur Konstanten gruppieren und Literale vermeiden, die in der gesamten Codebasis verstreut sind, sondern auch die Konstanten benennen. Mit anderen Worten, die Konstanten sind leicht zu merken und sinnvoll.

UserDefaults.Keys.schedule

Mit der Veröffentlichung von Swift 3 hat Apple in einigen seiner Frameworks eine ähnliche Technik eingeführt.

Notification.Name.UIApplicationWillTerminate

Was kommt als nächstes?

Erweiterungen sind in Swift ziemlich mächtig und die Techniken, die ich in diesem Tutorial gezeigt habe, sind nur einige Beispiele dafür, was möglich ist.

Laden Sie Ihre kostenlose Kopie von herunter
Das fehlende Handbuch
für die schnelle Entwicklung

Der Leitfaden, den ich gerne hätte, als ich anfing

Schließen Sie sich über 20.000 Entwicklern an, die mehr über Swift Development erfahren

Laden Sie Ihre kostenlose Kopie herunter

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.