Facciamo un sacco di lavoro asincrono su dispositivi mobili, nel tentativo di mantenere il nostro codice di bloccare il thread principale. In precedenza ciò significava molti metodi delegati, ma i progressi più recenti in Objective-C ci hanno permesso di restituire valori ai blocchi come gestori di completamento. Senza dubbio, dovremo fare un sacco di questo in swift pure.

Ecco una definizione di funzione da Objective-C che utilizza il modello di blocco di completamento e la sintassi associata per usarlo:

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;

Grazie cazzo di sintassi del blocco! Non riesco mai a ricordare nemmeno questa roba

Swift ha l’opportunità di migliorare questo dato che non deve essere un’aggiunta linguistica ripensata, può essere cotta fin dall’inizio.

Il risultato può sembrare complesso (come fanno tutte le dichiarazioni functions-in-function) ma è davvero semplice. È solo una definizione di funzione che prende una funzione come argomento quindi finché capisci il nesting questo dovrebbe diventare rapidamente chiaro:

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}

La chiusura di completamento qui è solo una funzione che prende una stringa e restituisce void. All’inizio questo suona all’indietro – questo prende una stringa come argomento? Vogliamo restituire una stringa! – ma non vogliamo restituire una stringa, significa che abbiamo bloccato fino al ritorno. Invece, stiamo chiamando una funzione che il chiamato ci ha dato e fornendo loro gli argomenti associati.

Utilizzare i gestori di completamento è più facile che dichiararli, grazie a un modo intelligente per abbreviare le chiamate di funzione dal team swift:

hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}

Questa è una chiusura finale, qualcosa che possiamo usare ogni volta che l’ultimo argomento è una chiusura. Usando la sintassi un po ‘ strana {() in }, abbiamo magicamente i risultati che abbiamo passato la chiusura nella nostra funzione asincrona. Devo ancora scandagliare le profondità di swift per capire cosa rende questa sintassi tick, ma per ora sono felice che funzioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.