Hent din gratis kopi af
den manglende Manual
til hurtig udvikling

den Guide, Jeg ville ønske, jeg havde, da jeg startede

Deltag i 20.000 + udviklere, der lærer om hurtig udvikling

Hent din gratis kopi

hvis du ser dette, antager jeg, at du er fortrolig med hurtige udvidelser. En hurtig udvidelse giver dig mulighed for at tilføje funktionalitet til en type, en klasse, en struktur, en enum eller en protokol. Men udvidelser er mere magtfulde end det. I denne episode vil jeg gerne vise dig fire kloge anvendelser af hurtige udvidelser.

Protokoloverensstemmelse

det hurtige programmeringssprog nævner, at udvidelser kan bruges til at tilpasse en eksisterende type til en protokol. Selvom dette ikke er nyt eller revolutionerende, kan det også hjælpe dig med at holde din kode organiseret.

tag protokollerne UITableViewDataSource og UITableViewDelegate som et eksempel. Dette eksempel kan se bekendt ud. Dette er fint, men det resulterer i en lang klasseimplementering, der kan blive vanskelig at navigere over tid.

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

du kan holde din kode organiseret ved at oprette en udvidelse for hver protokol, som typen overholder.

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

det bliver også lettere at navigere i kildefiler, hvis du gør det til en vane at bruge springlinjen øverst i kodes kildeditor.

det bliver også lettere at navigere i kildefiler, hvis du gør det til en vane at bruge springlinjen øverst i kodes kildeditor.

bevarelse af Initialisatorer

jeg lærte det næste trick fra Chris Eidhof. I dette eksempel skal vi først definere en struktur, Person. Strukturen definerer to konstante egenskaber af typen String, firstog last.

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

hurtig opretter generøst en initialisator for os, init(first:last:), som vi kan bruge til at instantiere en forekomst af Person strukturen. Det er ikke nyt.

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

desværre er initialisatoren ikke længere tilgængelig, hvis vi definerer en brugerdefineret initialisator i struct ‘ s definition.

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

initialisatoren er ikke længere tilgængelig, hvis vi definerer en brugerdefineret initialisator i strukturdefinitionen.

heldigvis har vi en nem løsning til at løse dette problem. Vi opretter en udvidelse til Person struct, hvor vi definerer den brugerdefinerede initialisator.

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

en udvidelse løser problemet.

Kodeseparation

vi kan tage det foregående eksempel et skridt videre. For et par år siden skitserede Natasha Murashev en teknik, der bruger udvidelser til at adskille tilstand fra adfærd. Hvis vi anvender denne teknik til det foregående eksempel, ender vi med noget som dette.

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 }}

typedefinitionen definerer kun de lagrede egenskaber. Der oprettes en udvidelse til opførslen af typen, det vil sige metoder og beregnede egenskaber. Resultatet er en klar adskillelse af tilstand (lagrede egenskaber) og adfærd (metoder og beregnede egenskaber).

vi kan tage dette et skridt videre ved at oprette en anden privat udvidelse til privat adfærd.

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

Kodeseparation og organisation er meget let at gøre ved hjælp af udvidelser. Jeg bruger det hele tiden. Hvis du går glip af Objective-C s header filer, så er dette et godt alternativ.

indlejrede typer

det hurtige programmeringssprog nævner, at udvidelser også giver dig mulighed for at definere og bruge indlejrede typer. Men jeg føler, at denne funktion er undervurderet. Jeg bruger det i hvert hurtigt projekt, for eksempel til at definere konstanter.

for et par måneder siden offentliggjorde jeg en tutorial om opbygning af en brugerdefineret kontrol ved hjælp af en bitmask. I denne tutorial gemmer vi den rå værdi af bitmask i brugerens standarddatabase.

// 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)}

i stedet for at bruge en streng bogstavelig bruger vi en konstant. Vi opretter en udvidelse til UserDefaults klassen, hvor vi definerer en enum uden tilfælde, Keys. Enum definerer en statisk konstant egenskab af typen String, schedule.

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

resultatet er ret rart, hvis du spørger mig. Ikke kun kan vi gruppere konstanter og undgå bogstaver, der er spredt over kodebasen, vi navngiver også plads til konstanterne. Med andre ord er konstanterne lette at huske og giver mening.

UserDefaults.Keys.schedule

med udgivelsen af Hurtig 3 vedtog Apple en lignende teknik i nogle af sine rammer.

Notification.Name.UIApplicationWillTerminate

Hvad er næste

udvidelser er ret kraftfulde i hurtig, og de teknikker, jeg viste i denne tutorial, er kun et par eksempler på, hvad der er muligt.

Hent din gratis kopi af
den manglende Manual
til hurtig udvikling

den Guide, Jeg ville ønske, jeg havde, da jeg startede

Deltag 20,000 + udviklere lære om hurtig udvikling

Hent din gratis kopi

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.