Stáhněte si zdarma kopii
chybějící příručky
pro rychlý vývoj

průvodce, který bych si přál, abych měl, když jsem začal

Připojte se k 20 000 + vývojářům, kteří se učí o vývoji Swift

Stáhněte si bezplatnou kopii

pokud to sledujete, předpokládám, že jste obeznámeni s rozšířeními Swift. Rozšíření Swift umožňuje přidat funkce do typu, třídy, struktury, enum nebo protokolu. Ale rozšíření jsou silnější než to. V této epizodě bych vám rád ukázal čtyři chytrá použití rozšíření Swift.

shoda protokolu

programovací jazyk Swift uvádí, že rozšíření lze použít k přizpůsobení existujícího typu protokolu. I když to není nové nebo revoluční, může vám také pomoci udržet váš kód organizovaný.

Vezměte si jako příklad protokoly UITableViewDataSource a UITableViewDelegate. Tento příklad může vypadat povědomě. To je v pořádku, ale výsledkem je zdlouhavá implementace třídy, která může být v průběhu času obtížná.

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

kód můžete uspořádat vytvořením přípony pro každý protokol, kterému typ odpovídá.

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

navigace ve zdrojových souborech je také snazší, pokud si zvyknete používat skokovou lištu v horní části zdrojového editoru Xcode.

navigace ve zdrojových souborech je také snazší, pokud si zvyknete používat skokovou lištu v horní části zdrojového editoru Xcode.

zachování Inicializátorů

další trik jsem se naučil od Chrise Eidhofa. Pro tento příklad musíme nejprve definovat strukturu Person. Struktura definuje dvě konstantní vlastnosti typu String, first a last.

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

Swift pro nás velkoryse vytvoří inicializátor init(first:last:), který můžeme použít k vytvoření instance struktury Person. To není nic nového.

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

bohužel inicializátor již není k dispozici, pokud definujeme vlastní inicializátor v definici struktury.

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

inicializátor již není k dispozici, pokud definujeme vlastní inicializátor v definici struktury.

naštěstí máme snadné řešení k vyřešení tohoto problému. Vytvoříme rozšíření pro strukturu Person, ve které definujeme vlastní inicializátor.

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

rozšíření řeší problém.

oddělení kódu

můžeme vzít předchozí příklad o krok dále. Před několika lety Natasha Murashev nastínila techniku, která používá rozšíření k oddělení stavu od chování. Použijeme-li tuto techniku na předchozí příklad, skončíme s něčím takovým.

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

definice typu definuje pouze uložené vlastnosti. Rozšíření je vytvořeno pro chování typu, tj. Výsledkem je jasné oddělení stavu (uložené vlastnosti) a chování (metody a vypočtené vlastnosti).

můžeme tento krok posunout dále vytvořením druhého privátního rozšíření pro soukromé chování.

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

oddělení kódu a organizace je velmi snadné pomocí rozšíření. Používám ho pořád. Pokud vám chybí hlavičkové soubory Objective-C, pak je to pěkná alternativa.

vnořené typy

programovací jazyk Swift uvádí, že rozšíření také umožňují definovat a používat vnořené typy. Ale mám pocit, že tato funkce je podhodnocená. Používám ji v každém projektu Swift, například k definování konstant.

před několika měsíci jsem publikoval tutoriál o vytváření vlastního ovládání pomocí bitmask. V tomto tutoriálu ukládáme surovou hodnotu masky v databázi uživatelských výchozích hodnot.

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

místo použití řetězcového doslovu používáme konstantu. Vytvoříme příponu pro třídu UserDefaults, ve které definujeme enum bez případů, Keys. Enum definuje jednu statickou konstantní vlastnost typu String, schedule.

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

výsledek je docela pěkný, pokud se mě zeptáte. Nejenže můžeme seskupovat konstanty, vyhýbat se literálům, které jsou rozptýleny po celé kódové základně, můžeme také jmenovat konstanty. Jinými slovy, konstanty jsou snadno zapamatovatelné a mají smysl.

UserDefaults.Keys.schedule

s vydáním Swift 3 Apple přijal podobnou techniku v některých svých rámcích.

Notification.Name.UIApplicationWillTerminate

co bude dál

rozšíření jsou v Swiftu poměrně silná a techniky, které jsem ukázal v tomto tutoriálu, jsou jen několika příklady toho, co je možné.

Stáhněte si zdarma kopii
chybějící příručka
pro rychlý vývoj

průvodce, který bych si přál, abych měl, když jsem začal

přidejte se k 20,000 + vývojáři učení o Swift vývoj

Stáhněte si zdarma kopii

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.