descărcați copia gratuită a
manualul lipsă
pentru dezvoltare rapidă

ghidul pe care mi-aș dori să-l am când am început

Alăturați – vă peste 20.000 de dezvoltatori care învață despre dezvoltarea Swift

descărcați copia gratuită

dacă urmăriți acest lucru, atunci presupun că sunteți familiarizați cu extensiile Swift. O extensie Swift vă permite să adăugați funcționalitate la un tip, o clasă, un struct, un enum sau un protocol. Dar extensiile sunt mai puternice decât atât. În acest episod, aș dori să vă arăt patru utilizări inteligente ale extensiilor Swift.

conformarea Protocolului

limbajul de programare Swift menționează că extensiile pot fi utilizate pentru a conforma un tip existent unui protocol. Deși acest lucru nu este nou sau revoluționar, vă poate ajuta, de asemenea, să vă păstrați codul organizat.

luați protocoalele UITableViewDataSource și UITableViewDelegate ca exemplu. Acest exemplu poate părea familiar. Acest lucru este bine, dar are ca rezultat o implementare îndelungată a clasei, care poate deveni dificil de navigat în timp.

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

vă puteți păstra codul organizat creând o extensie pentru fiecare protocol cu care tipul este conform.

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

navigarea fișierelor sursă devine, de asemenea, mai ușoară dacă vă obișnuiți să utilizați bara de salt din partea de sus a editorului sursă Xcode.

navigarea fișierelor sursă devine, de asemenea, mai ușoară dacă vă obișnuiți să utilizați bara de salt din partea de sus a editorului sursă Xcode.

păstrarea Inițializatorilor

am învățat următorul truc de la Chris Eidhof. Pentru acest exemplu, trebuie mai întâi să definim o structură, Person. Structura definește două proprietăți constante de tip String, firstși last.

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

Swift creează generos un inițializator pentru noi, init(first:last:), pe care îl putem folosi pentru a instantia o instanță a structurii Person. Acest lucru nu este nou.

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

din păcate, inițializatorul nu mai este disponibil dacă definim un inițializator personalizat în definiția struct.

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

inițializatorul nu mai este disponibil dacă definim un inițializator personalizat în definiția structurii.

din fericire, avem o soluție ușoară pentru a rezolva această problemă. Creăm o extensie pentru Person struct în care definim inițializatorul personalizat.

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

o extensie rezolvă problema.

separarea codului

putem lua exemplul anterior cu un pas mai departe. Cu câțiva ani în urmă, Natasha Murashev a subliniat o tehnică care folosește extensii pentru a separa starea de comportament. Dacă aplicăm această tehnică la exemplul anterior, ajungem la ceva de genul acesta.

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

definiția tipului definește numai proprietățile stocate. O extensie este creată pentru comportamentul tipului, adică metodele și proprietățile calculate. Rezultatul este o separare clară a stării (proprietăți stocate) și a comportamentului (metode și proprietăți calculate).

putem face acest pas mai departe prin crearea unei a doua extensii private pentru comportamentul privat.

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

separarea și organizarea codului este foarte ușor de făcut folosind extensii. Îl folosesc tot timpul. Dacă pierdeți fișierele antet ale Objective-C, atunci aceasta este o alternativă plăcută.

tipuri imbricate

limbajul de programare Swift menționează că extensiile vă permit, de asemenea, să definiți și să utilizați tipuri imbricate. Dar simt că această caracteristică este subevaluată. Îl folosesc în fiecare proiect Swift, de exemplu, pentru a defini constante.

în urmă cu câteva luni, am publicat un tutorial despre construirea unui control personalizat folosind o mască de biți. În acel tutorial, stocăm valoarea brută a măștii de biți în baza de date user defaults.

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

în loc să folosim un șir literal, folosim o constantă. Creăm o extensie pentru clasa UserDefaultsîn care definim un enum fără cazuri, Keys. Enum definește o proprietate constantă statică de tip String, schedule.

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

rezultatul este destul de frumos dacă mă întrebați. Nu numai că putem grupa constante, evitând literalele care sunt împrăștiate în întreaga bază de cod, dar și spațiul de nume constantele. Cu alte cuvinte, constantele sunt ușor de reținut și de înțeles.

UserDefaults.Keys.schedule

odată cu lansarea Swift 3, Apple a adoptat o tehnică similară în unele dintre cadrele sale.

Notification.Name.UIApplicationWillTerminate

ce urmează

extensiile sunt destul de puternice în Swift, iar tehnicile pe care le-am arătat în acest tutorial sunt doar câteva exemple despre ceea ce este posibil.

descărcați copia gratuită a
manualul lipsă
pentru dezvoltare rapidă

ghidul pe care mi-aș dori să-l am când am început

Alăturați-vă 20,000+ dezvoltatorii de învățare despre dezvoltare Swift

descărcați copia gratuit

Lasă un răspuns

Adresa ta de email nu va fi publicată.