Closures - Kapatmalar - 2


Closure, bir fonksiyonun ya da metodun bir ifade içerisinde bildirilip kullanılması anlamına gelir.
Closure’lar fonksiyon türlerindendir. Bir closure bildirimi sanki fonksiyonu bildirip onun adresini kullanmak gibidir.

Örneğin:
var f: (Int) -> Int
f = {(a: Int) -> Int in return a * a}
işlemi  bazı ayrıntılar dışında aşağıdaki ile eşdeğerdir:
var f: (Int) -> Int
func foo(a: Int) -> Int{
return a * a
}
f = foo
Bir fonksiyonun parametresi fonksiyon türündense biz onu çağırırken argüman olarak closure verebiliriz. Örneğin:
func foo(val: Int, f: (Int) -> Int){
print(f(val))
}
foo(10, f: {(a: Int)->Int in return a * a})
Burada foo fonksiyonunun birinci parametresi geri dönüş değeri Int ve parametresi Int türden olan bir fonksiyon türündendir. (Yani parametre değişkeni fonksiyonun adresini alır). Fonksiyon çağrılırken doğrudan aynı türden clousure verilmiştir.
Örneğin:
let names = [“Ali”, “Veli”, “Selami”, “Ayşe”, “Fatma”]
var result = names.sort({(a: String, b: String) -> Bool in return a < b})
print(result)
in anahtar sözcüğünden sonra closure içerisine istenildiği kadar deyim yerleştirilebilir.
Örneğin:
func foo(val: Int, f: (Int) -> Int){
print(f(val))
}

foo(10, f: {
(a: Int)->Int in
print(“Ok”)
if a > 0 {
return a * a * a
}
else {
return a * a
}}) // 1000
Closure parametreleri yine default olarak let biçimdedir. Ancak biz onu var biçiminde de bildirebiliriz. Bu durumda parametre değişkeni üzerinde değişiklik yapabiliriz.
Örneğin:
var f: (Int) -> Int
f = {(var a: Int) -> Int in a = a * 2; return a } // a değiştirilebilir
print(f(10))
Eğer biz burada var anahtar sözcüğünü kaldırsaydık a’ya değer atama kısmında error oluşurdu.