Swift: Closures

      Nessun commento su Swift: Closures

swift-hero

 

Ciao a tutti cari amici di iProg, mi dispiace molto se in questo ultimo mese siamo stati poco presenti, ma purtroppo a causa di alcuni lavori ed esami universitari, io e i miei colleghi non abbiamo avuto tempo di scrivere nuovi articoli. Finalmente oggi ho la giornata leggermente  più libera e quindi colgo l’occasione per poter scrivere questo nuovo articolo. Come si può intuire dal logo oggi continuiamo a parlare del linguaggio Swift, in particolare  oggi vorrei iniziare a mostrarvi i Closures. I Closures li possiamo interpretare  come se fossero dei blocchi in Obj-c oppure come se fossero delle funzioni lambda per chi conosce Python o Java. La sintassi generale di un Closures è:

{
(parametri)->(tipo di ritorno) in
istruzioni
}

Ma vediamo qualche esempio pratico. Un primo modo per creare un  Closures è:

var blocco1 = {

println(“Sono blocco1”)

}

blocco1()

Come possiamo notare non è niente di particolare , ma rendiamo le cose un po’ più divertenti:

var blocco2 = { (nome: String, cognome: String) -> String in

return nome + ” “ + cognome

}

println(blocco2(“Mario”,“Rossi”))

Questa “tipologia” di blocco è già un po’ più articolata ma niente di eclatante. I blocchi ci consentono di fare delle cose veramente molto interessanti, inoltre grazie ad essi possiamo comprimere di molto il codice, ora vi mostrerò .

var nomi = [“Mario”,“Nicola”,“Antonio”,“Pasquale”,“Barbara”]

var blocco3 = sorted(nomi, {(s1:String, s2:String) -> Bool in

return s1 < s2

})

println(blocco3

Con questo codice abbiamo creato un blocco che fa utilizzo della funzione sorted che ci consente di ordinare un array in maniera facile e veloce ma è possibile  compattare ancora di più il codice:

var blocco4 = sorted(nomi,{$0 < $1})

println(blocco3)

Ora voglio mostrarvi  una delle funzionalità più interessanti dei Closures ovvero: come passare a un parametro di una funzione un blocco. La sintassi generale è la seguente:

func nomeFunzione(nomeBlocco: (parametri) -> (tipo di ritorno))

Esempio

func funzione (closure:(a:String,b:String)->String){

closure(a: ” mario “, b: ” rossi “)

}

funzione({(a,b) in

return b + a

})

L’ultima cosa che voglio mostrarvi oggi è come creare una funzione che ritorna una funzione che a sua volta ritorna un intero(scusate il gioco di parole)

func funzioneEsterna (incremento:Int) -> () -> Int{

var totale = 0

func interna () -> Int {

totale += incremento

return totale

}

    returninterna

}

var  incremento10 = funzioneEsterna(10)

println(incremento10())//restituisce 10

println(incremento10())//restituisce 20

Per domande, consigli o chiarimenti lasciate un commento