diciamo si definisce una chiusura
let closure: Int -> Bool
una volta che il tipo di chiusura è nota (tipo di parametri e tipo di ritorno) , scrivendo è abbastanza semplice, si nomina la lista dei parametri, seguita dalla parola chiave in
e poi il corpo della funzione (con un ritorno alla fine, se la funzione restituisce il tipo non è Void
(a.k.un ()
)
// closure that returns if an integer is even
closure = { integer in
return integer %2 == 0
}
Nel tuo caso, Int -> Int -> Bool -> String
significa
- una funzione che prende un int come parametro e restituisce
- una funzione che prende un int come parametro e restituisce
- una funzione che accetta un Bool come parametro e restituisce
Un modo di scrivere che in codice:
func prepareForSum(first: Int) -> Int -> Bool -> String {
return { secondInteger in
return { shouldSumIntegers in
var result: Int
// for the sake of example
// if boolean is true, we sum
if shouldSumIntegers {
result = first + secondInteger
} else {
// otherwise we take the max
result = max(first, secondInteger)
}
return String(result)
}
}
ora è possibile utilizzarlo come quella
let sumSixteen = prepareForSum(16) // type of sumSixteen is Int -> Bool -> String
let result1 = sumSixteen(3)(true) // result1 == "19"
let result2 = sumSixteen(26)(false) // result2 == "26"
quello che fa è più complicato e dovrebbe essere riscritto probabilmente – Fonix
@Fonix - questo fa parte del supporto di programmazione funzionale che Swift ha incorporato – Cristik
@Cristik non lo rende meno brutto da leggere/utilizzare. 'f (1) (2) (true)' kinda interrompe il tutto "le funzioni dovrebbero leggere come frasi" che obj-c e swift provano a usare gli sviluppatori (a ragione). potrebbe essere una buona ragione per questo ma sono sicuro che potrebbe essere evitato – Fonix