Herkese selamlar! Bugün girdiğim mülakatlarda karşılaştığım konulardan bahsedeceğim. Bir süredir mülakatlara giriyorum ve bu konuda tecrübe edinmeye çalışıyorum. İlk girdiğim mülakatı düşündüğümde (gerçekten inanılmaz kötüydü) belirli bir yol katettiğimi görüyorum. En azından artık karşıma nasıl bir şey geleceği ve hangi konular üzerindeki bilgimin sınanacağını az çok kestirmiş durumdayım. Bu yazıda da biraz bunlar üzerine konuşacağız.
Protocols
Tek başına ele alabileceğimiz gibi OOP altında da bahsedebileceğimiz bir konu. Kısaca ne olduğuna değinirsek; protocol’ler sınıflar ya da diğer türler tarafından benimsenebilecek yöntem ya da özelliklerin bir planıdır. Bir protocol birden fazla protocol’ü inherit edebilir ve protocol’lere extension yazabiliriz.
Alan hesabı yaptığımız bir protocol’ümüz olduğunu varsayalım. Bu protocol bize gettable bir property ve bir yöntem verir.
Area sınıfını AreaProtocol’e uygun hale getirdik. Bu şu anlama geliyor, artık protocol’ün bize sağladığı propertyleri ve yöntemleri sınıf içinde kullanabiliriz.
Area sınıfından oluşturacağımız bir obje ile de sonuca erişebiliriz.
- Multiple Protocols
Şimdi ise multiple protocol’lere göz atalım.
Örnekte görüldüğü üzere bir sınıf birden fazla protocol’e uygun hale getirilebilir.
- Protocol Inheritance
Örnekte HouseType protocol’ünün House protocol’ünü inherit ettiğini görürüz. Apartment sınıfı sadece HouseType protocol’üne uygundur fakat HouseType House’ı inherit ettiği için sınıfta her iki protocol’ün de özelliklerini uygulamamız gerekir. Bunların yanı sıra bir protocol birden fazla protocol’ü de inherit edebilir.
- Protocol Extensions
Yukarıda da bahsettiğimiz gibi protocol’leri extend edebiliriz.
Yukarıdaki örnekte name propertysini aldığımız bir protocol tanımladık ve onu extend ederek uppercase fonksiyonunu ekledik.
Output:
lowercase name: damlauppercase name: DAMLA
Generics
Farklı veri türleriyle kullanılabilen işlev ya da sınıflar oluşturmamıza olanak tanır. Kodun yeniden kullanılabilmesini sağlar.
- Generic functions
Output:
Data Passed: swiftData Passed: 5
<T> tip parametresiyle genel bir fonksiyon yarattık ve bu fonksiyona hangi veri tipini iletirsek o şekilde çalışacaktır.
- Generic class
Output:
Generic class returns: trueGeneric class returns: swift
Örnekte TypeInfo adında generic bir sınıf oluşturduk. Bu sınıf, herhangi bir veri türüyle çalışmak için kullanılabilir. Biz örnekte bool ve string veri tipiyle çalıştık.
Closures
İşlev adı olmayan özel fonksiyonlardır. Closure’lar herhangi bir sabite ve değişkene yapılan referansları yakalayabilir ya da saklayabilir.
- Closure parametre almayabilir ve bir şey return etmeyebilir.
- Closure parametre alabilir ve geriye bir parametre return edebilir.
- Trailing Closure
Bir fonksiyon son parametresi olarak bir closure alıyorsa parametrenin adını belirtmeden closure’ı fonksiyon gövdesi olarak kullanabiliriz.
Output:
area of the square: 16
- Non-escaping Closures
Bir closure non-escaping parametresiyle işaretlenirse bu closure’ın fonksiyonun gövdesinden kaçamayacağı anlamına gelir. Closure’ları fonksiyon argümanı olarak kullandığımızda closure, fonksiyonun gövdesiyle birlikte yürütülür ve compiler’ı return eder. Execution bittiğinde closure’ın bellekteki varlığı son bulur.
Closure parametreleri default olarak non-escaping’dir. Closure execution’dan kaçmak için closure’ı escaping olarak işaretlememiz gerekir.
- Escaping Closures
Bir closure’ı escaping olarak işaretlemek closure içinde self kullanmamız gerektiği anlamına gelir. Closure fonksiyona argüman olarak iletilir ve fonksiyon return ettikten sonra çağırılır.
Bu yazıda bahsedeceklerim bu kadar. Devamında ise diğer önemli noktaları konuşuyor olacağız. Sonraki yazıda görüşmek üzere.
Referanslar: