Sayma tipi, C’de de mevcut olan ve bir grup bilgiyi birlikte tanımlayan bir yapıdır. Ancak Swift’te, C’den farklı olarak tanımlanan sayma tipi yapının elemanlarına tam sayı karşılıklar atanmaz.
Sayma tipinin yazılış biçimi aşağıdaki gibidir:
enum Ad{
// Grup bilgi tanımı
}
Aşağıda daha anlaşılır bir sayma tipi tanımı verilmiştir:
enum Kita {
case Avrupa
case Amerika
case Asya
case Afrika
case Avusturalya
case Antarktika
}
let xx = Kita.Afrika
xx değişkenine Kita adlı sayma tipinin Afrika bileşeni atanmıştır.
Enumeration tipi switch-case ile birlikte de kullanılır:
ÖRNEK:
enum Kita {
case Avrupa
case Amerika
case Asya
case Afrika
case Avusturalya
case Antarktika
}
let xx = Kita.Afrika
switch xx
{case .Amerika:print("Amerikayı seçtiniz ")
case .Asya:print("Asyayı seçtiniz ")
case .Afrika:print ("Afrikayı seçtiniz ")
case .Avusturalya:print("Avusturalyayı seçtiniz ")
case .Avrupa:print("Avrupayı seçtiniz ")
case .Antarktika:print("Antarktikayı seçtiniz ")
}
PROGRAMIN ÇIKTISI
Afrikayı seçtiniz
UZATMALAR (EXTENSIONS)
Uzatmalar, mevcut bir sınıf (class), bir yapı (structure) ya da bir sayma tipine (enumeration) yeni bir işlevsellik ekleme imkanı sağlayan mekanizmalardır. Objective C’deki category mekanizmasına benzer yapılardır. Ancak Swift’te extension’ların isimleri yoktur.
Swift’te extension’ların gerçekleştirebileceği işlemler ise aşağıda verilmiştir:
1) Sınıf, yapı ve sayma tipine hesaplanmış özellikler ve hesaplanmış static özellikler eklemek
2) Yukardaki yapılara, örnek metotları (instance methods) ve tip metotları (type methods) eklemek
3) Yeni başlangıç oluşturucular (initializer) tanımlamak
4) İndisler (subscripts) tanımlamak, iç içe tipler (nested types) oluşturmak ve kullanmak
5) Protokollere yeni özellikler eklemek
Bir uzatmanın yazılış biçimi aşağıdaki gibidir;
extension TipAdi {
// TipAdi’na eklenecek yeni işlevsellik komutları
}
extension TipAdi: Protokol1, Protokol2 {
// Protokol gereksinimi komutları
}
İleriki bölümlerde bununla ilgili örnekler göreceğiz.
PROTOKOLLER (PROTOCOLS)
Protokol, belirli bir işi gerçekleştirmek için gerekli metotlar, özellikler ve diğer gereksinimlerin bir planını tanımlar. Protokol, bu işi aktif olarak gerçekleştirmez, bir anlamda işin tanımını ortaya koyar. İşin gerçekleştirimi ise bir sınıf, yapı ya da enumeration ile gerçekleştirilir.
Protokoller sınıf yapı ve enumeration’lara benzer şekilde tanımlanır.
protocol Ad {
// Protokol tanımı
}
struct Yapı: Protokol1, Protokol2 {
// yapı tanımı
}
Bir sınıf, bir super sınıftan türemişse önce sınıf adı, sonra super sınıf adı yazılır:
class Sınıf: SuperSınıf, Protokol1, Protokol2 {
// sınıf tanımı
}
İleriki bölümlerde bununla ilgili örnekler göreceğiz.
DELEGE ETME (DELEGATION)
Delege etme özelliği, nesneye yönelik programlamanın ve Swift’in önemli özelliklerinden biridir. Delege etme deyince anlaşılan şudur: bir sınıf ya da yapıdan üretilen bir nesnenin kendi sorumluluklarından bazılarını başka bir sınıf nesnesine aktarabilme mekanizmasıdır. Genellikle bir protokol içinde delege edilecek sorumluluklar tanımlanır. Delegation özelliği genellikle, belirli tipteki eylemlere reaksiyon vermek ya da kaynak tipi ile ilgilenmeden dış kaynaktan veri almak gibi işlemlerde kullanılır.
JENERİKLER (GENERICS)
Jenerik kod, program yazan kişiler için, daha esnek, yeniden kullanılabilir fonksiyonlar ve diğer tiplerle kolayca birlikte çalışan tipler oluşturma imkanı sağlar.
Jenerik kod üretme, Swift’in en önemli ve faydalı özelliklerinden biridir. Örneğin, dizi ve sözlükler aslında jenerik koleksiyonlardır. Jenerik fonksiyonlar ise genel bir şekilde yazılıp her tip ile çalışabilir:
ÖRNEK:
Aşağıdaki DiziOlus() adlı fonksiyon jenerik tipte bir fonksiyon olup hem Int, hem Double hem de String tipi ile çalışmaktadır:
func DiziOlus<ElTip>(el: ElTip, sayi: Int) -> [ElTip] {
var sonuc = [ElTip](repeating: el, count: sayi)
return sonuc
}
print(DiziOlus(el: 6, sayi: 4))
print(DiziOlus(el: 7.5, sayi: 5))
print(DiziOlus(el: "aa", sayi: 9))
PROGRAMIN ÇIKTISI
[6, 6, 6, 6]
[7.5, 7.5, 7.5, 7.5, 7.5]
[aa, aa, aa, aa, aa, aa, aa, aa, aa]
KAPATMA (CLOSURE)
Swift’te kapatma adı verilen yapılar C ve Objective C’deki blok yapılarına ya da başka dillerdeki lambda yapılarına benzer.
Global ve iç içe kullanılmış fonksiyonlar aslında kapatmaların özel halleridir. Global fonksiyonlar adı olan fakat değer almayan kapatmalardır. İç içe (nested) fonksiyonlar ise ismi olan ve değer kullanan kapatmalardır.
Nihayet normal kapatmalar ise isimsiz olarak kullanılan kapatmalardır.
Bir kapatmanın genel yazılımı,
{ (Parametreler) -> Gönderdiği Tip in
Deyimler
}
şeklindedir.
ÖRNEK:
Aşağıdaki closure, s1 < s2 ise true s1 > s2 ise false değerini göndermektedir:
{(s1: String, s2: String) -> Bool in
return s1 < s2 })
Bu closure, aşağıda sort(sıralama) fonksiyonunun bir argümanı gibi kullanılmıştır:
var sehir = ["londra", "paris", "atina", "barcelona", "münih"]
sehir = sehir.sorted(by: {(s1: String, s2: String) -> Bool in return s1 < s2 })
print(sehir)
PROGRAMIN ÇIKTISI
Program çalıştırılınca, sehir dizisindeki şehirler alfabetik sıraya dizilmişlerdir:
[atina, barcelona, londra, münih, paris]
Aşağıdaki programda ise ters alfabetik sıra elde edilmiştir:
var sehir = ["londra", "paris", "atina", "barcelona", "münih"]
sehir = sehir.sorted(by: {(s1: String, s2: String) -> Bool in return s1 > s2 })
print(sehir)
[paris, münih, londra, barcelona, atina]