Scarica la Tua Copia Gratuita di
Mancante Manuale
per Swift Sviluppo

La Guida Desidero che ho Avuto Quando ho Iniziato

Unisciti a più di 20.000 gli Sviluppatori di Apprendimento Su Swift Sviluppo

Scaricare Gratis

Se stai guardando questo, quindi presumo che hai dimestichezza con la Swift estensioni. Un’estensione Swift consente di aggiungere funzionalità a un tipo, una classe, una struttura, un enum o un protocollo. Ma le estensioni sono più potenti di quello. In questo episodio, mi piacerebbe mostrarti quattro usi intelligenti delle estensioni Swift.

Conformità al protocollo

Il linguaggio di programmazione Swift menziona che le estensioni possono essere utilizzate per conformare un tipo esistente a un protocollo. Anche se questo non è nuovo o rivoluzionario, può anche aiutarti a mantenere il tuo codice organizzato.

Prendi i protocolli UITableViewDataSource e UITableViewDelegate come esempio. Questo esempio può sembrare familiare. Questo va bene, ma si traduce in una lunga implementazione di classe che può diventare difficile da navigare nel tempo.

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

È possibile mantenere il codice organizzato creando un’estensione per ogni protocollo a cui il tipo è conforme.

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

La navigazione dei file sorgente diventa anche più semplice se si ha l’abitudine di utilizzare la barra di salto nella parte superiore dell’editor di origine di Xcode.

La navigazione dei file sorgente diventa anche più semplice se si ha l'abitudine di utilizzare la barra di salto nella parte superiore dell'editor di origine di Xcode.

Preserving Initializers

Ho imparato il prossimo trucco da Chris Eidhof. Per questo esempio, dobbiamo prima definire una struttura, Person. La struttura definisce due proprietà costanti di tipo String, firste last.

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

Swift crea generosamente un inizializzatore per noi, init(first:last:), che possiamo usare per istanziare un’istanza della struttura Person. Non e ‘una novita’.

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

Sfortunatamente, l’inizializzatore non è più disponibile se definiamo un inizializzatore personalizzato nella definizione della struttura.

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

L'inizializzatore non è più disponibile se definiamo un inizializzatore personalizzato nella definizione della struttura.

Fortunatamente, abbiamo una soluzione semplice per risolvere questo problema. Creiamo un’estensione per la struttura Person in cui definiamo l’inizializzatore personalizzato.

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

Un'estensione risolve il problema.

Separazione del codice

Possiamo fare un ulteriore passo avanti nell’esempio precedente. Alcuni anni fa, Natasha Murashev ha delineato una tecnica che utilizza le estensioni per separare lo stato dal comportamento. Se applichiamo questa tecnica all’esempio precedente, finiamo con qualcosa di simile.

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

La definizione del tipo definisce solo le proprietà memorizzate. Viene creata un’estensione per il comportamento del tipo, ovvero i metodi e le proprietà calcolate. Il risultato è una chiara separazione di stato (proprietà memorizzate) e comportamento (metodi e proprietà calcolate).

Possiamo fare un ulteriore passo avanti creando una seconda estensione privata per il comportamento privato.

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

La separazione e l’organizzazione del codice sono molto facili da fare usando le estensioni. Lo uso sempre. Se ti mancano i file di intestazione di Objective-C, allora questa è una bella alternativa.

Tipi nidificati

Il linguaggio di programmazione Swift menziona che le estensioni consentono anche di definire e utilizzare tipi nidificati. Ma sento che questa caratteristica è sottovalutata. Lo uso in ogni progetto Swift, ad esempio, per definire costanti.

Alcuni mesi fa, ho pubblicato un tutorial sulla creazione di un controllo personalizzato utilizzando una maschera di bit. In questo tutorial, memorizziamo il valore grezzo della maschera di bit nel database dei valori predefiniti dell’utente.

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

Invece di usare una stringa letterale, usiamo una costante. Creiamo un’estensione per la classe UserDefaultsin cui definiamo un enum senza casi, Keys. L’enum definisce una proprietà costante statica di tipo String, schedule.

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

Il risultato è abbastanza bello se me lo chiedi. Non solo possiamo raggruppare le costanti, evitando i letterali sparsi in tutta la base di codice, ma anche lo spazio dei nomi delle costanti. In altre parole, le costanti sono facili da ricordare e hanno senso.

UserDefaults.Keys.schedule

Con il rilascio di Swift 3, Apple ha adottato una tecnica simile in alcuni dei suoi framework.

Notification.Name.UIApplicationWillTerminate

Qual è il prossimo

Le estensioni sono abbastanza potenti in Swift e le tecniche che ho mostrato in questo tutorial sono solo alcuni esempi di ciò che è possibile.

Scarica la tua copia gratuita di
Il manuale mancante
per lo sviluppo Swift

La guida che vorrei avere quando ho iniziato

Unisciti a oltre 20.000 sviluppatori che imparano a conoscere Swift Development

Scarica la tua copia gratuita

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.