Swift Enumeration Kullanımı

Merhaba arkadaşlar ,
mobilhanem.com sitemiz için anlattığımız/yayınladığımız Swift Dersleri serimize bu yazımızda Swift Enumeration Kullanımı ile devam edeceğiz. Bir önceki yazımızda Swift Closure Kullanımı  konusundan bahsetmiştik. Bu derse başlamadan önce xcode’u kurmak ve playground  üzerinde swift kodu yazabilmek için bu dersimizi okumanızı tavsiye ederim.

Swift Enumeration Nedir ?

Kısa haliyle enum ‘lar birbirleriyle mantıksal olarak alakalı değerleri bir arada gruplamamızı sağlayan yapılardır. Birbiri ile bağlı bu değerlere hem isimleriyle hemde bir index numarası ile erişebilmemiz mümkündür.

Birbiri ile mantıksal olarak alakalı değerler derken, haftanın günleri, iPhone modellerinin isimleri ya da Türkiye ‘nin illeri gibi. Bu değerleri enum yapısını kullanarak temsil edebiliriz. Enum ‘lardan türetme yapılamaz ve enum ‘lar value types ‘dır. Yani enum ‘lar adres, değişken değil değerin kendisini tutarlar.

Enumeration Oluşturma

Haftanın günlerini bir arada tutan bir enum oluşturalım,

 enum Gunler {
    case pazartesi
    case sali
    case carsamba
    case persembe
    case cuma
    case cumartesi
    case pazar
 }

Yukarıda da gördüğünüz gibi syntax ‘ı enum keyword ‘ü ile başlar ve ardından enum ‘a vereceğimiz isim ve içerisinde de birbiri ile alakalı değerlerimiz bulunmaktadır. Bu tanımlamayı daha kısa şekildede yapabiliriz,

 enum Gunler {
    case pazartesi, sali, carsamba, persembe, cuma, cumartesi, pazar
 }

Gibi tek satırda da tanımlama işlemimizi gerçekleştirebilmekteyiz.

Enumeration ‘ları Değişkenlere Atama

Yukarıda oluşturduğumuz Gunler enumeration ‘nının içerisindeki değerleri bir değişkene atmamız mümkündür,

var bugun = Gunler.cuma

bugun isimli değişkenimize Gunler enumeration ‘nının cuma değerini atadık. bugun değişkenini ekrana bastırırsak cuma değerini görürüz. bugun değişkeni Gunler tipinde oluşturduğumuz için bundan sonraki atamalarımızı şu şekilde daha kısa olarak yapabiliriz,

bugun = .cumartesi

Bir başka şekilde değişkene atamamızda mümkündür,

var yarin : Gunler = .cumartesi

Şeklinde yarin isimli değişkenimizi tanımlayıp ilk değer atamasını yapabiliriz.

Switch Case ile Enumeration Değerlerini Birlikte Kullanma

switch bugun {
case .pazartesi:
    print("Haftanın bitmesine daha çok var ")
case .sali:
    print("Hala çok var")
case .carsamba:
    print("Dayan yolu yarıladın")
case .persembe:
    print("Çok az kaldı")
case .cuma:
    print("Ve yarın tatilsin")
case .cumartesi:
    print("Tatilin tadını çıkar")
case .pazar:
    print("Yarın pazartesi biraz dinlen")
}

Switch case kullanımı daha önceki derslerde bahsetmiştim eğer aşina değilseniz bu yazıyı okuyabilirsiniz. bugun isimli değişkenimizi oluştururken değerini cuma olarak vermiştik ve ardından kısa olarak atama yapabileceğimiz göstermek için değerini cumartesi olarak değiştirdik. Switch case yapımızda bugun isimli değişkenimizi ele alacağımızı bildirdik ve ardından bugun değişenimizin alabileceği bütün değerleri case ile birlikte yazdık. Burada default bloğunun olmama sebebi ise tam olarakta budur. Eğer alabileceği bütün değerleri yazmamış olsaydık derleyicimiz hata verecekti. Kısaca alabileceği bütün değerleri yazmışsak default bloğunu yazmamıza gerek yoktur eğer alabileceği bir değeri bile yazmamışsak default bloğunu yazmamız zorunludur. bugun değişkenimizin değeri cumartesi olduğu için case .cumartesi: bloğuna girecek ve ekrana Tatilin tadını çıkar yazısını yazacaktır.

İlişkili Değerler

Swift dilinde enum değerlerini özel tiplerde değerler tutmak içinde kullanabilmekteyiz. Mesela kullanıcı uygulamamıza giriş yapabilmek için iki seçenekten birini kullanmak durumunda olsun buna uygun enum yapısını yazalım,

enum GirisSekli {
    case adSoyad(String,String)
    case tcKimlikNo(Int)
}

Kullanıcımız uygulamamıza adını soyadını vererek veya TC kimlik numarasını vererek giriş yapabileceği için iki adet değişkenimizi parametre alabilecek şekilde oluşturduk. adSoyad, 2 parametre almaktadır ve bunların ikiside String türündedir, tcKimlikNo ise tek parametre almaktadır ve türü ise Int ‘dır. Şimdi de kullanıcımız bu iki giriş şeklinden birini seçmiş gibi düşününelim ve kodumuzu yazalım,

var kullanicininGirisSekli = GirisSekli.adSoyad("Taha Eren", "Buyruk")

Şeklinde parametrelerimizi vererek kullanicininGirisSekli değişkenimizi oluşturduk. Bir sonraki girişinde kullanıcımız TC kimlik numarasını girmeyi tercih eder ise,

kullanicininGirisSekli = .tcKimlikNo(12312312312)

Şeklinde kullanicininGirisSekli değişkenimizi oluşturacağız.

Seçilen Giriş Şeklinin Parametrelerine Switch Case ile Erişme

switch kullanicininGirisSekli {
case .adSoyad(let adi, let soyadi):
    print("Kullanıcının Adı ->: \(adi), Kullanıcının Soyadı -> \(soyadi)")
case .tcKimlikNo(let TC):
    print("Kullanıcının TC numarası ->: \(TC).")
}

Şeklinde gayet kolay bir şekilde kullanıcının seçtiği giriş şeklinin aldığı parametre değerlerine erişebiliyoruz. adSoyad için konuşucak olursak aldığı ilk parametreye adi, ikinci parametreye ise soyadi ismini verdik ve case ‘imizin içerisinde de bu değerlere verdiğimiz isimler ile erişebildik aynı yöntem ile tcKimlikNo içinde yazdık.

Enumeration Satır Değerleri

Enumeration ‘ların ilişkili olduğu türler vardır. Buna temel değer türü yani raw value type denir. Bunları enum ‘ı tanımlarken enum ‘nın isminden sonra sembolünü koyup ardından türünü yazarız.  Enum türünün temel değer türleri Int, Double, Float, String ya da Character türü olabilir. Hemen yazmaya başlayalım,

enum Gezegenler: Int {
    case merkur = 1, venus, dunya, mars, jupiter, saturn, uranus, neptun
}

Gezegenler ‘i oluşturduk. Raw value type olarak Int verdik ve ardından ilk değerimize yani merkur ‘e 1 değerini atadık. Burada Int atamak yerine yukarıda saydığım değişken tiplerinden birinide atayabilirdik. merkur değerine 1 ‘i atadıktan sonra derleyicimiz otomatik olarak ,

venus = 2,

dunya = 3,

Jupiter = 4,

uranus = 5,

neptun = 6

Değerlerini atar. Ve biz bu sayede bu sayilar ile erişebilmekteyiz. Derleyicimizin bu işlemi yapabilmesi için raw value type olarak verdiğimiz türün ilk değer olarak yazdığımız değerin türü ile aynı olması gereklidir. Bu örnek için konuşursak Int yazdığımız için verdiğimiz değerin Int olması gerekir. İlk değer olarakta 1 verdiğimiz için sorun yoktur. Fakat 1.3 değerini vermiş olsaydık derleyicimiz bize Int türünde bir değer beklediğini söyleyen bir hata verecekti.

rawValue Property ‘sini Kullanma

Yukarıda verdiğim örnekteki dunya değerinin raw value ‘suna, rawValue property ‘si ile erişelim,

let dunyaninSirasi = Gezegenler.dunya.rawValue

Daha öncedende söylediğim gibi dunyaninSirasi değişkeninin değeri 3 olacaktır.

Peki şimdi de yeni bir enum oluşturalım ve raw value type olarak Int yerine String verelim ve ardından yine değerinin raw value ‘suna erişelim,

enum Yonler: String {
    case kuzey, guney, dogu, batı
}

Yonler isminde bir enum tanımladık ve raw value type olarak String verdik ve ardından değerlerimizi yazdık.

Şimdi de rawValue property ‘sini kullanarak guney ‘in raw value ‘suna erişelim,

let yon = Yonler.guney.rawValue

yon değişkenimizin değeri String olarak “guney” oldu.

Raw Value Kullanarak Değeri Bulma

Raw value kullanarak enum içerisindeki değere ulaşabiliriz,

let gezegen = Gezegenler(rawValue: 3)

Burada Gezegenler(rawValue: 3) diyerek derleyicimize, Gezegenler enum ‘nın içerisinde rawValue ‘su 3 olan değeri bana getir demiş oluyoruz ve ardından eğer değer gelmiş ise o değeri gezegen isimli değişkenimize atıyoruz. Bu işlem bize her zaman optional değer döndürür. Eğer daha önceki dersleri takip ettiyseniz bir fikriniz vardır eğer takip etmediyseniz eski yazıları okuyabilir veya Optionals dersini bekleyebilirsiniz. Ve raw value ‘su 3 olan değerimiz dunya olduğu için gezegen isimli değişkenimizin içerisinde dunya değeri olacaktır.

 

Ve enumeration kullanımı dersimizin sonuna geldik. Kafanıza takılanlar için yorum kısmından yorum yazabilirsiniz 🙂

print(“Perfecting oneself is as much unlearning as it is learning.”)

print(“Edsger Dijkstra”)

 

10

Taha Eren Buyruk

Başkent Üniversitesi Bilgisayar Mühendisliği.

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?