lataa ilmainen kopio
The Missing Manual
for Swift Development

the Guide I Wish I Had When I Started Out

Join 20,000 + Developers Learning About Swift Development

Download Your Free Copy

If you ’re watching this, then I oletan you’ re familiar the Swift extensions. Swift-laajennuksen avulla voit lisätä toimintoja tyyppiin, luokkaan, rakenteeseen, enumiin tai protokollaan. Pidennykset ovat kuitenkin tehokkaampia. Tässä jaksossa haluan näyttää neljä näppärää käyttötapaa Swift-laajennuksille.

Protocol Conformance

Swift-ohjelmointikieli mainitsee, että laajennuksia voidaan käyttää olemassa olevan tyypin mukauttamiseen protokollaan. Vaikka tämä ei ole uusi tai vallankumouksellinen, se voi myös auttaa sinua pitämään koodin järjestyksessä.

otetaan esimerkiksi UITableViewDataSource ja UITableViewDelegate protokollat. Tämä esimerkki voi näyttää tutulta. Tämä on hieno, mutta se johtaa pitkään luokan toteutus, joka voi tulla vaikea navigoida ajan.

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

voit pitää koodisi järjestettynä luomalla laajennuksen jokaiselle protokollalle, jonka tyyppi noudattaa.

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

lähdetiedostojen Navigoiminen helpottuu myös, jos ottaa tavaksi käyttää Xcode-lähdeeditorin yläosassa olevaa hyppypalkkia.

lähdetiedostojen Navigoiminen helpottuu myös, jos ottaa tavaksi käyttää Xcode-lähdeeditorin yläosassa olevaa hyppypalkkia.

Säilövien Alustajien

Opin seuraavan kikan Chris Eidhofilta. Tätä esimerkkiä varten on ensin määriteltävä rakenne, Person. Rakenne määrittelee kaksi vakio-ominaisuutta, joiden tyyppi on String, first ja last.

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

Swift jalomielisesti luo meille alustajan, init(first:last:), jonka avulla voimme instantioida Person – rakenteen ilmentymän. Tämä ei ole uutta.

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

valitettavasti alustaja ei ole enää käytettävissä, jos määrittelemme mukautetun alustajan structin määritelmässä.

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

alustaja ei ole enää käytettävissä, jos määrittelemme mukautetun alustajan rakenteen määrittelyssä.

onneksi meillä on helppo työ ratkaista tämä ongelma. Luomme Person – rakenteelle laajennuksen, jossa määrittelemme mukautetun alustajan.

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

laajennus ratkaisee ongelman.

koodien erottelu

voimme viedä edellisen esimerkin askeleen pidemmälle. Natasha Murashev hahmotteli muutama vuosi sitten tekniikan, joka käyttää laajennuksia erottamaan valtion käyttäytymisestä. Jos sovellamme tätä tekniikkaa edelliseen esimerkkiin, päädymme johonkin tällaiseen.

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

tyyppimääritys määrittelee vain tallennetut ominaisuudet. Tyypin käyttäytymiselle, eli menetelmille ja laskennallisille ominaisuuksille, luodaan laajennus. Tuloksena on selkeä erottaminen tila (tallennetut ominaisuudet) ja käyttäytyminen (menetelmät ja laskennalliset ominaisuudet).

voimme ottaa tämän askeleen pidemmälle luomalla toisen private extension for private behavior.

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

koodin erottaminen ja organisointi on erittäin helppoa laajennusten avulla. Käytän sitä koko ajan. Jos et Objective-C: n header-tiedostoja, niin tämä on mukava vaihtoehto.

sisäkkäiset tyypit

Swift-ohjelmointikieli mainitsee, että laajennukset mahdollistavat myös sisäkkäisten tyyppien määrittelyn ja käytön. Mutta minusta tämä ominaisuus on aliarvostettu. Käytän sitä esimerkiksi jokaisessa Swift-projektissa vakioiden määrittelyyn.

muutama kuukausi sitten julkaisin opetusohjelman, jossa opeteltiin rakentamaan mukautettu ohjaus bittimaskilla. Tässä opetusohjelmassa Tallennamme bittinaamion raaka-arvon käyttäjän oletustietokantaan.

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

merkkijonon sijasta käytetään vakiota. Luomme UserDefaults – luokalle laajennuksen, jossa määrittelemme enumin ilman tapauksia, Keys. Enum määrittelee yhden staattisen vakion ominaisuuden, jonka tyyppi on String, schedule.

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

tulos on aika kiva, jos minulta kysytään. Emme ainoastaan voi ryhmitellä vakioita, välttäen kirjaimistoja, jotka ovat hajallaan koodebaasissa, vaan myös nimetään vakiot. Toisin sanoen vakiot on helppo muistaa ja niissä on järkeä.

UserDefaults.Keys.schedule

Swift 3: n julkaisun myötä Apple otti vastaavanlaisen tekniikan käyttöön joissakin kehyksissään.

Notification.Name.UIApplicationWillTerminate

What ’ s Next

laajennukset ovat varsin tehokkaita Swiftissä ja tässä tutoriaalissa esittelemäni tekniikat ovat vain muutamia esimerkkejä siitä, mikä on mahdollista.

Lataa
The Missing Manual
for Swift Development

the Guide I Wish I Had When I Started Out

Join 20,000 + Developers Learning About Swift Development

Download Your Free Copy

Vastaa

Sähköpostiosoitettasi ei julkaista.