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”)
Yorum Yaz