Last Ned Din Gratis Kopi av
The Missing Manual
For Rask Utvikling

Guiden Jeg Skulle Ønske Jeg Hadde Da Jeg Startet

Bli Med 20 000 + Utviklere Som Lærer Om Swift Development

Last Ned Din Gratis Kopi

hvis du ser på dette, antar jeg at du er kjent med Swift-utvidelser. En Swift-utvidelse lar deg legge til funksjonalitet i en type, en klasse, en struct, en enum eller en protokoll. Men utvidelser er kraftigere enn det. I denne episoden vil jeg gjerne vise deg fire smarte bruksområder Av Swift-utvidelser.

Protokollkonformitet

Programmeringsspråket Swift nevner at utvidelser kan brukes til å tilpasse en eksisterende type til en protokoll. Selv om dette ikke er nytt eller revolusjonerende, kan det også hjelpe deg med å holde koden organisert.

ta protokollene UITableViewDataSource og UITableViewDelegate som et eksempel. Dette eksemplet kan se kjent ut. Dette er greit, men det resulterer i en lang klasseimplementering som kan bli vanskelig å navigere over tid.

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

du kan holde koden organisert ved å opprette en utvidelse for hver protokoll typen samsvarer med.

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

Navigering av kildefiler blir også lettere hvis du gjør det til en vane å bruke hoppelinjen øverst I xcodes kilderedigerer.

 Navigering av kildefiler blir også lettere hvis du gjør det til en vane å bruke hoppelinjen øverst I xcodes kilderedigerer.

Bevare Initialisatorer

Jeg lærte det neste trikset Fra Chris Eidhof. For dette eksemplet må vi først definere en struktur, Person. Strukturen definerer to konstante egenskaper av typen String, first og last.

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

Swift skaper generøst en initializer for oss, init(first:last:), som vi kan bruke til å instantiere en forekomst av Person – strukturen. Dette er ikke nytt.

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

dessverre er initialiseringen ikke lenger tilgjengelig hvis vi definerer en tilpasset initialiserer i structens definisjon.

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 lenger tilgjengelig hvis vi definerer en egendefinert initialisator i strukturdefinisjonen.

Heldigvis har Vi En enkel løsning for å løse dette problemet. Vi lager en utvidelse for Person struct der vi definerer den tilpassede initialiseringen.

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 utvidelse løser problemet.

Kodeseparasjon

vi kan ta det forrige eksemplet et skritt videre. For Noen år siden skisserte Natasha Murashev en teknikk som bruker utvidelser for å skille stat fra atferd. Hvis vi bruker denne teknikken til forrige eksempel, ender vi med noe slikt.

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

typedefinisjonen definerer bare de lagrede egenskapene. En utvidelse er opprettet for oppførselen av typen, det vil si metoder og beregnede egenskaper. Resultatet er en klar adskillelse av tilstand (lagrede egenskaper) og atferd (metoder og beregnede egenskaper).

Vi kan ta dette ett skritt videre ved å opprette en annen privat utvidelse for privat oppførsel.

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

Kodeseparasjon og organisering er veldig enkelt å gjøre ved hjelp av utvidelser. Jeg bruker det hele tiden. Hvis Du savner Objective-Cs header-filer, så er dette et fint alternativ.

Nestede Typer

Programmeringsspråket Swift nevner at utvidelser også lar deg definere og bruke nestede typer. Men jeg føler at denne funksjonen er undervurdert. Jeg bruker det i Hvert Swift-prosjekt, for eksempel å definere konstanter.

for noen måneder siden publiserte jeg en veiledning om å bygge en tilpasset kontroll ved hjelp av en bitmask. I den opplæringen lagrer vi den rå verdien av bitmask i user defaults-databasen.

// 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 å bruke en streng bokstavelig, bruker vi en konstant. Vi lager en utvidelse for UserDefaults – klassen der vi definerer en enum uten tilfeller, Keys. Enum definerer en statisk konstant egenskap av typen String, schedule.

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

resultatet er ganske fint hvis du spør meg. Ikke bare kan vi gruppere konstanter, unngå bokstaver som er spredt over kodebasen, vi navngir også konstantene. Med andre ord er konstantene enkle å huske og gi mening.

UserDefaults.Keys.schedule

Med utgivelsen Av Swift 3 tok Apple en lignende teknikk i noen av sine rammer.

Notification.Name.UIApplicationWillTerminate

Hva Blir Det Neste

Utvidelser er ganske kraftige I Swift, og teknikkene jeg viste i denne opplæringen er bare noen få eksempler på hva som er mulig.

Last Ned Din Gratis Kopi av
Den Manglende Håndboken
For Rask Utvikling

Guiden Jeg Skulle Ønske Jeg Hadde Da Jeg Startet

Bli Med 20 000 + Utviklere Å Lære Om Swift Development

Last Ned Din Gratis Kopi

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.