Swift @autoclosure Attribute

Swift AutoClosure

Bir fonksiyonun şayet “() -> T” türünde bir parametresi varsa, @autoclosure attribute (özniteliği) ile küme parantezi kullanılmadan çağırılabilir. Örneğin:

// Explicit Closure

func Test(parametre p: () -> Int)

{

print(p())

}

Test(parametre: {3 + 5}) // 8

Yerine aşağıdaki gibi kullanılabilir:

func Test(parametre p: @autoclosure () -> Int)

{

print(p())

}

Test(parametre: 3 + 5) // 8

Bu kod parçasında argüman otomatik olarak bir closure’a dönüşmektedir.

Reklamlar

Swift4 type() fonksiyonu ile dinamik türün öğrenilmesi

Yakında çıkacak olan #Swift kitabımdan küçük alıntılara devam:

Swift’te bir nesnenin dinamik tür ismini öğrenmek için geçmiş versiyonlarda dynamicType kullanılmaktaydı ancak yeni versiyonda bu işlem için artık type() isimli fonksiyon kullanılmaktadır.

Bu fonksiyonun parametre etiket isminin “of” olması okuyucunun aklını karıştırıp, C türevi dillerdeki typeof() operatörününün Swift’te olduğu izlenimini uyandırmamalıdır. “obj” bir nesne örneği olmak üzere:

print(obj.dynamicType) // yerine
print(type(of: obj)) // kullanılmalıdır

Şüphesiz aynı işlem gerektiğinde self için de yapılabilir.

Swift Protocol Composition

Birden fazla protokol ile birleştirilmiş referanslar bildirilebilir. Bu durumda o referansa ancak o bildirimde belirtilen protokollerin hepsini destekleyen bir sınıf, yapı ya da enum değişkeni atanabilir.

Bildirimde protokol birleştirme işlemi protokol isimlerinin arasına “&” sembolü konularak yapılır. Örneğin:

protocol Protokol1

{

func Foo()

}

protocol Protokol2

{

func Bar()

}

class CSample1 : Protokol1

{

func Foo()

{

print(“foo”)

}

}

class CSample2 : Protokol1, Protokol2

{

func Foo()

{

print(“foo”)

}

func Bar()

{

print(“bar”)

}

}

/////////////TEST//////////////

func Test(prm: Protokol1 & Protokol2)

{

prm.Foo()

prm.Bar()

}

// Test(prm: CSample1())

// Argument type CSample1 doesnt conform to expected type ‘…’

Test(prm: CSample2()) // OK

Şüphesiz protokol listesinde sırasının bir önemi yoktur. Örneğin:

let p1: Protokol1 & Protokol2 = CSample2()

let p2: Protokol2 & Protokol1 = p1       // geçerli

Kotlin Nedir?

Google’ın 2017’deki son etkinliğinde resmen duyurusunu yaptığı KOTLIN, yazılım dünyasında deprem etkisi yaptı. Özellikle hali hazırda Java ile Android uygulaması geliştirenlerin çoğu bu haberi heyecan ve endişeyle karşıladı. Aykut Taşdelen yol sohbetlerinde Kotlin’in aslında çok da yeni bir gelişme olmadığını yaklaşık 1 yıldır gündeminde olduğunu ve Kotlin’e dair görüşlerini anlatıyor. Java mı daha iyi, Kotlin mi? Kotlin’e geçmeli miyim? Java’nın sonu mu geldi? gibi çeşitli sorulara bu video’da cevaplar bulacaksınız.

Swift Generic & Contraint Kullanımı

Dikkat: Aşağıdaki yazı yakında çıkacak olan Swift kitabımdan bir alıntıdır izinsiz kopyalanıp kullanılamaz.

Swift’te generic bir fonksiyon ya da sınıfa herhangi bir türde açılım yapılabilir. Ancak geliştirici şayet isterse açılım yapılabilecek türlerde kısıtlamaya gidebilir. Kısıtlamalar, açılım yapılabilecek türlerin belirli bir taban sınıftan türetilmesi ya da belirli bir protokolü implemente etmesi şartına dayandırılabilir. Örneğin aşağıdaki Foo() isimli fonksiyonun ilk parametresine açılım yapacak olan türün CKisitlama isimli sınıftan türetilmesi, ikinci parametresi ise PKisitlama isimli protokolden implemente edilmesi gereklidir.

class CKisitlama {

}

class Sinif1 {

}

class Sinif2 : CKisitlama {

}

protocol PKisitlama {

}

class CSinif3 {

}

class CSinif4 : PKisitlama {

}

func Foo<A: CKisitlama, Z: PKisitlama>(p1:A, p2:Z)

{

}

////// TEST ///////

Foo(Sinif1(), p2: CSinif3()) // Geçersiz!!!

Foo(Sinif2(), p2: CSinif4())

Sinif1 ve Sinif3 türündeki nesneler gerekli şartları sağlamadıkları için A ve Z yer tutucuları için açılım yapamazlar.

where anahtar sözcüğü

Swift’te kısıtlamalar sadece generic fonksiyonlar için değil aynı zamanda generic türler için de belirtilebilir. Kısıtlamayı aşma koşulu ise yine belirli bir sınıftan türetme ya da belirli bir protokolü implemente etme şeklinde kurgulanır. Generic türün bildiriminde <> içerisinde yazılan yer tutucu(lar) için where anahtar sözcüğünden sonra bir veya daha fazla sayıda kısıtlama belirtilebilir. Örneğin aşağıdaki Controller isimli sınıfta T yerine PRepository ve PTestable protokollerini implemente eden bir tür kullanılabilir.

protocol PRepository

{

}

 

protocol PTestable

{

}

 

class CRepository1

{

}

 

class CRepository2 : PRepository

{

}

 

class CRepository3 : PRepository, PTestable

{

}

 

class Controller<T where T: PRepository, T: PTestable>

{

}

var cnt = Controller<CRepository3>()

Bu örnekte CRepository1 ve CRepository2 gerekli şartları sağlamadığı için açılım yapma amacıyla kullanılamayacak sınıflardır.