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