töltse le ingyenes példányát
a hiányzó kézikönyv
a gyors fejlesztéshez

az útmutató, amelyet Bárcsak rendelkeztem volna, amikor elindultam

csatlakozzon több mint 20 000 fejlesztőhöz, akik megismerik a Swift fejlesztést

töltse le ingyenes példányát

ha ezt nézi, akkor feltételezem, hogy ismeri a Swift kiterjesztéseket. A Swift kiterjesztés lehetővé teszi funkcionalitás hozzáadását egy típushoz, egy osztályhoz, egy struktúrához, egy enumhoz vagy egy protokollhoz. De a Kiterjesztések ennél erősebbek. Ebben az epizódban szeretném megmutatni a Swift kiterjesztések négy okos felhasználását.

protokoll Megfelelőség

a Swift programozási nyelv megemlíti, hogy a Kiterjesztések felhasználhatók egy meglévő típus protokollnak való megfelelésére. Bár ez nem új vagy forradalmi, segíthet a kód szervezésében is.

vegyük példaként a UITableViewDataSource és UITableViewDelegate protokollokat. Ez a példa ismerősnek tűnhet. Ez rendben van, de hosszadalmas osztály-megvalósítást eredményez, amely idővel nehezen navigálható.

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

a kódot úgy rendezheti, hogy létrehoz egy kiterjesztést minden olyan protokollhoz, amelynek a típus megfelel.

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

a forrásfájlokban való navigálás akkor is könnyebbé válik, ha szokássá teszi az Xcode forrásszerkesztőjének tetején található ugrósáv használatát.

 a forrásfájlokban való navigálás akkor is könnyebbé válik, ha szokássá teszi az Xcode forrásszerkesztőjének tetején található ugrósáv használatát.

Inicializálók megőrzése

a következő trükköt Chris Eidhoftól tanultam. Ebben a példában először meg kell határoznunk egy struktúrát, Person. A szerkezet két állandó tulajdonságot határoz meg: String, first és last.

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

a Swift nagyvonalúan létrehoz nekünk egy inicializátort, init(first:last:), amelyet felhasználhatunk a Person struktúra példányának példányosítására. Ez nem új.

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

sajnos az inicializáló már nem érhető el, ha egyéni inicializálót definiálunk a struct definíciójában.

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

az inicializáló már nem érhető el, ha egyéni inicializátort határozunk meg a szerkezet definíciójában.

szerencsére van egy egyszerű megoldás a probléma megoldására. Létrehozunk egy kiterjesztést a Person struktúrához, amelyben meghatározzuk az egyéni inicializálót.

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

a kiterjesztés megoldja a problémát.

Kód elválasztás

az előző példát egy lépéssel tovább vihetjük. Néhány évvel ezelőtt Natasha Murashev felvázolt egy technikát, amely kiterjesztéseket használ az állapot elválasztására a viselkedéstől. Ha ezt a technikát alkalmazzuk az előző példára, akkor valami ilyesmit kapunk.

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

a típusdefiníció csak a tárolt tulajdonságokat határozza meg. Egy kiterjesztés jön létre a típus viselkedéséhez, azaz a módszerekhez és a számított tulajdonságokhoz. Az eredmény az állapot (tárolt tulajdonságok) és a viselkedés (módszerek és számított tulajdonságok) egyértelmű elválasztása.

ezt az egy lépést tovább tehetjük, ha létrehozunk egy második privát kiterjesztést a privát viselkedéshez.

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

a kódok szétválasztása és szervezése nagyon egyszerű a kiterjesztések használatával. Állandóan használom. Ha hiányzik az Objective-C fejlécfájlja, akkor ez egy jó alternatíva.

beágyazott típusok

a Swift programozási nyelv megemlíti, hogy a kiterjesztések lehetővé teszik a beágyazott típusok meghatározását és használatát is. De úgy érzem, ez a funkció alulértékelt. Minden Swift projektben használom, például állandók meghatározására.

néhány hónappal ezelőtt közzétettem egy oktatóanyagot egy egyedi vezérlő felépítéséről egy bitmaszk segítségével. Ebben az oktatóanyagban a bitmaszk nyers értékét tároljuk a user defaults adatbázisban.

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

a string literál használata helyett konstansot használunk. Létrehozunk egy kiterjesztést a UserDefaults osztályhoz, amelyben egy enumot definiálunk esetek nélkül, Keys. Az enum egy String, schedule típusú statikus állandó tulajdonságot határoz meg.

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

az eredmény nagyon szép, ha engem kérdezel. Nem csak az állandókat csoportosíthatjuk, elkerülve a kódbázisban szétszórt literálokat, hanem az állandók névterét is. Más szavakkal, az állandók könnyen megjegyezhetők és értelmesek.

UserDefaults.Keys.schedule

a Swift 3 megjelenésével az Apple hasonló technikát alkalmazott néhány keretrendszerében.

Notification.Name.UIApplicationWillTerminate

mi a következő lépés

a Kiterjesztések elég erősek a Swift-ben, és az ebben az oktatóanyagban bemutatott technikák csak néhány példa arra, hogy mi lehetséges.

töltse le ingyenes példányát
a hiányzó kézikönyv
a gyors fejlesztéshez

az útmutató, amelyet Bárcsak rendelkeztem volna, amikor elindultam

csatlakozzon több mint 20 000 fejlesztőhöz, akik megismerik a Swift fejlesztést

töltse le ingyenes példányát

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.