Una chiusura è solo una funzione con i parametri spostato all'interno delle parentesi, con la parola chiave in
per separare i parametri dal corpo della funzione. I due esempi che seguono definiscono funzioni equivalenti:
func myFunc(number: Int) -> Int {
let result = 3 * number
return result
}
let myClosure = { (number: Int) -> Int in
let result = 3 * number
return result
}
Si può effettivamente entrambi chiamare esattamente nello stesso modo:
let x = myFunc(2) // x == 6
let y = myClosure(2) // y == 6
Si noti come il secondo esempio è esattamente la stessa della prima, solo nel primo esempio, i parametri (number: Int) -> Int
sono al di fuori delle parentesi e nel secondo esempio i parametri sono all'interno delle parentesi, seguite dalla parola chiave in
.
map
funziona prendendo un array (numbers
, nell'esempio) e creando un nuovo array che è il risultato dell'applicazione della funzione di chiusura a ciascun elemento in numbers
. Quindi se numbers
è [1, 2, 3]
, l'esempio precedente inizierà con 1
. Applicherà la funzione di chiusura che produrrà un 3
(perché tutto ciò che fa è moltiplicare l'elemento dal primo array per 3). Lo fa per ogni elemento in numbers
, fino a quando non ha prodotto un nuovo array, [3, 6, 9]
.
Se si desidera, è possibile chiamare map
utilizzando i nomi della funzione sopra o della chiusura di cui sopra, oppure scrivendo esplicitamente all'interno di map
. Tutti gli esempi indicati sono totalmente equivalenti:
let numbers = [1, 2, 3]
// Example 1
let times3 = numbers.map(myFunc) // times3 == [3, 6, 9]
// Example 2
let timesThree = numbers.map(myClosure) // timesThree == [3, 6, 9]
// Example 3
let xThree = numbers.map({ (number: Int) -> Int in
let result = 3 * number
return result // xThree == [3, 6, 9]
})
noti che nell'esempio 3 è identica all'Esempio 2, solo nell'esempio 3 la chiusura è chiarita esplicitamente all'interno di map
, mentre nell'esempio 2 è stato assegnato alla chiusura a una costante denominata myClosure
e la costante è stata fornita a map
.
Spero che questo aiuti - le chiusure sono divertenti, ma confuse.
Questa è anche una buona introduzione alle chiusure in Swift: http: //letvargo.mooo.com/a-beginners-guide-to-closures-in-swift/) –