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.
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" }}
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" }}
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é.
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