Scrivere completamento blocchi con chiusure in Swift

Anche dopo che ho avuto una buona maniglia sul concetto di blocchi, ho dovuto cercare la loro sintassi, ogni volta che ho voluto scrivere qualcosa, ma il più semplice dei blocchi (grazie fuckingblocksyntax.com). Swift versione di blocchi, noto come chiusure, molto più pulito, più naturale approccio alla sintassi. Quindi, senza ulteriori indugi, è ora di imparare le chiusure come mi ha insegnato mio padre: scrivendo un blocco di completamento.

L’API di animazione di UIView è una delle aree più comuni che gli sviluppatori iOS utilizzano i blocchi. Prima di scrivere ciecamente il proprio metodo, provare a utilizzare uno degli esempi di codice di Apple per familiarizzare con la sintassi. Di seguito è riportato un esempio di Objective-C, e quindi lo stesso codice scritto in Swift:

Objective C:

Swift:

Con grande sgomento di conigli e sviluppatori miopi, carets ( ^ ) non si trovano (ancora) in Swift. Riposa in pace vecchio amico, sei stato sostituito dalla parola chiave in. Si utilizza la parola chiave in una volta che hai finito di dichiarare i parametri e i valori di ritorno per la chiusura. Questo avrà più senso se ti mostro quale completamento automatico compilato una volta che ha saputo quale metodo volevo:

UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)?, completion: ((Bool) -> Void)?)

Concentrandosi su questa sintassi, diventa chiaro come scrivere correttamente i parametri e restituire i valori di una chiusura:

{(parameters) -> (return type) in expression statements}

Nell’esempio di codice Swift sopra, entrambe le chiusure di animazione hanno restituito void, quindi abbiamo potuto eliminare la sintassi del tipo di ritorno tutti insieme. Ecco perché vedi solo il () per i parametri. Si noti che anche se non ci sono parametri, come nella prima chiusura, è comunque necessario quelli vuoti ( ) prima della parola chiave in. Sono richiesti. In grassetto in modo da ricordarlo.

Ok, ora proviamo a scrivere il nostro metodo Swift con una chiusura di completamento. Nel repository Github collegato in fondo a questo post, ho lavorato su un’app client Github in Swift con un team di compagni di codice. In questo progetto abbiamo un controller di rete che gestisce tutte le chiamate di rete asincrone all’API di Github.

Scriviamo un metodo che recupera un elenco di utenti da una query di ricerca sul client. Questo metodo avrà bisogno di una chiusura di completamento per consentire al controller della vista richiedente di sapere quando la chiamata di rete è terminata e fornire una serie di modelli utente per popolare la nostra vista di raccolta.

Ecco come sarebbe la firma della funzione:

func searchUsersWithSearchTerm(searchTerm: String, completionClosure: (users :User) ->()) 

Abbiamo due parametri qui: un tipo di stringa chiamato searchTerm e la nostra chiusura di completamento. Si noti la sintassi nel parametro di chiusura? Il primo è il nome della nostra chiusura, che è come lo chiameremo più tardi nel metodo, quindi il parametro (array di utenti), seguito dal nostro valore di ritorno (void). Di seguito è riportata un’approssimazione di come appare il corpo di questo metodo:

 //setup a NSMutableRequest with the correct API URL and parameters //setup a dataTask on our NSURLSession instance //once our datatask has successfully retrieved the data we wanted, and we have parsed through it to create an array of User Models, we call our completion closure like this: var users : User = //Parse the JSON data into Users completionClosure(users: users)

Chiamare la nostra chiusura di completamento in Swift è quasi lo stesso modo in cui chiamiamo il nostro blocco di completamento in Objective-C. Si chiama proprio come qualsiasi altra funzione, e ci assicuriamo di passare in un array come parametro, poiché è così che lo abbiamo definito nella nostra firma di funzione. Ho volutamente lasciato fuori tutto il codice di rete per mantenere questo post il più breve possibile, ma sentitevi liberi di controllare il repository Github se siete interessati a vedere come funziona. Abbiamo in programma di avere un post sul blog sulla rete in Swift nel prossimo futuro.

Infine, diamo un’occhiata a come chiameremmo questo metodo dal nostro SearchUsersViewController:

Un’altra cosa che voglio notare è come ho chiamato addOperationWithBlock() sul nostro mainQueue(). Se una chiusura è l’ultimo parametro della firma di una funzione, è possibile utilizzare una sintassi speciale per renderla ancora più pulita. Questo è indicato come una chiusura finale. Le chiusure finali vengono scritte direttamente dopo la () di una chiamata di funzione. Di seguito è riportata una chiamata di funzione, prima con una chiusura regolare, quindi con una chiusura finale.

È una sottile differenza, ed entrambi i modi funzionano. Basta ricordare che deve essere l’ultimo parametro della funzione per utilizzare la sintassi di chiusura finale.

Ora dovresti conoscere la sintassi di base delle chiusure in Swift. Per alcune cose di livello più avanzato sulle chiusure, controlla il linguaggio di programmazione Swift su iBooks. Ha un’intera sottosezione su di loro. Ed ecco il link al progetto client github.

C’è anche già una controparte Swift per fuckingblocksyntax.com chiamato, avete indovinato, fuckingclosuresyntax.com che è sicuramente la pena di aggiungere alla barra dei preferiti come si impara Swift.

Buona giornata.

Pronto a diventare uno sviluppatore professionista? Mettiti in contatto scopri come!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.