Mobil Programlama

iOS

DERS PROGRAMI
iOS 101 Ders Programı

Sayma Tipi (Enumeration), Protokoller (Protokols) ve Delege Etme (Delegation)

Lisans: Creative Commons 11.12.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

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]