Swift’te Fonksiyonların Değişken Olarak Kullanılması

Not : Aşağıdaki yazı yakında yayınlanak olan kitabımdan bir alıntı olup izinsiz kopyalanıp kullanılamaz !

Fonksiyonlar da değişkenler içerisinde saklanabilir. Bu cümleden kastedilen şey; bir fonksiyonun bir nesneyle temsil edilmesidir. Böyle bir nesnenin tanımlanması aşağıdaki gibi genelleştirilebilir:

var nesne: (parametrik_yapı) -> geri_dönüş_türü;

Bu şekilde tanımlanmış olan bir nesneye fonksiyonun adı yani referansı atandığında söz konusu nesne o fonksiyonu temsil etmeye ve ona öykünerek davranmaya başlar. Nesne tanımlanırken belirlenen parametrik yapı ve geri dönüş değerine uygun olmayan bir fonksiyonun ise söz konusu nesne ile temsil edilmesi mümkün değildir.

İpucu : C# programcıları burada anlatılan olguyu delegate konusuna C++ programcıları ise fonksiyon pointer’larına benzetebilir.

Örnek : Aşağıdaki kodda obj isimli nesne iki adet Int parametre alan ve geri Bool türünde geri dönüş üreten bir fonksiyonu temsil edebilir. Bu nesneye Karsilastir() isimli bir fonksiyon atanmış ve obj nesnesi bu fonksiyonu temsil eder hale getirilmiştir. Bu noktada obj sanki Karsilastir() fonksiyonuymuş gibi -ona öykünerek- çalışabilecektir.
var obj: (Int, Int) -> Bool;

func Karsilastir(a:Int, b:Int) -> Bool
{
if a < b
{
return true
}
else
{
return false
}
}

obj = Karsilastir

var s = obj(4, 9)

Bu sayede bir fonksiyon başka bir fonksiyonu parametre olarak alabilir hatta geri dönüş değeri olarak döndürebilir. Aşağıdaki kodda Foo() isimli fonksiyonun ikinci parametresi, parametre almayan ve String döndüren bir fonksiyon türündedir. Foo() fonksiyonuna parametre olarak bu prototipe uygun bir fonksiyon olarak Bar() geçilmiştir. Foo() kendi içerisinde Bar() fonksiyonunu bu sayede 5 kez çağırmaktadır.

func Foo(p1:Int, p2: () -> String)
{
for (var i=1; i <= p1; ++i)
{
println(p2())
}
}

func Bar() -> String
{
return “Apple”
}

Foo(5, Bar)

Benzer şekilde bir fonksiyon başka bir fonksiyonu geri dönüş değeri olarak döndürebilir. Aşağıdaki örnekte Sample() geriye EmptyTester() fonksiyonunu döndürmektedir. EmptyTester() ise parametresine geçilen String’in boş olup olmadığını gösteren bir Bool değer döndürmektedir. Sample() çağırılarak elde edilen EmptyTester() fonksiyonuna iki farklı String parametre olarak geçilip geri döndürdüğü değerler ekrana yazdırılmıştır.

func EmptyTester(s:String) -> Bool
{
return s.isEmpty
}

func Sample() -> (String) -> Bool
{
var t: (String) -> Bool;
t = EmptyTester
return t
}

var s1 = Sample()(“Apple”)
println(s1)

var s2 = Sample()(“”)
println(s2)

Reklamlar