Swift Enum Yapısı

Enum’lar, birbiri ile alakalı değerleri gruplamamızı sağlayan yapılardır. Basit örneklerden başlarsak; haftanın günleri, cinsiyetler, takas(alım-satım) gibi içerisinde birden fazla değer barındıran fakat temelde bir çatıya ait olan yapıları nitelendirirler. Value type olarak çalışırlar.

Yukarıdaki gibi iki farklı şekilde de ifade edilebilirler.

rawValue

Enum’lara bir tip vererek ardından istediğimiz her bir case için de bu tipi karşılamasını sağlayarak rawValue oluşturabiliriz.

Örneğin yukarıdaki gibi Pazartesi günü için bir rawValue tanımı yaparsak aşağıdaki gibi bir sonuç alacağızdır.

Peki rawValue değeri yalnızca bu şekilde bir String göstermek gibi basit bir şey için mi kullanılacaktır. Tabii ki hayır.

Şimdi backend’den bize bazı bilgilerin enum olarak değil de belirli stringler ile geldiğini düşünelim. Fakat bunlar bizim için bir çatıyı oluşturan farklı durumlar olsun. Benim vereceğim örnekte vergiler üzerinden gideceğiz. Client tarafında kendimiz bir Enum oluşturalım ve String rawValue’a sahip olsun. Ardından backend’den geleceğine emin olduğumuz, el sıkışılan durumlar için case’leri oluşturalım ve her ihtimale karşı bir tane de “other” case’i oluşturalım.

Son olarak Enum’a ait bir static fonksiyon oluşturarak “init(rawValue:)” metodu ile bir case’ini oluşturup bize döndürmesini sağlayalım. “init(rawValue:)” metodu geriye optional döndüğü için böyle bir metot oluşturmak istedim. “init(rawValue:)” bir case oluşturamadan bize dönerse de “other” case’i döndürmesini isteyelim.

Daha sonrasında da iki farklı case oluşturarak sonuçları görelim.

Geçerli bir rawValue ile oluşturmaya çalıştığım zaman istediğim sonucu bana verdi. Fakat geçersiz bir rawValue ile gittiğim zaman da “other” case’i bana döndürmeyi başardı.

Eğer Int türünde bir rawValue’a sahip olmak istersek ve hiçbir rawValue değerini biz vermezsek, 0’dan başlayarak artırımlı olarak tüm case’lere ait rawValue’ları verecektir.

Yani yukarıdaki koddan aşağıdaki gibi bir çıktı alacağız.

Fakat örneğin biz bir tanesine rawValue değeri verdik ve kalanlara yine bir dokunuşta bulunmadıysak, verilen case’den sonraki case’lerin rawValue’ları o case’in rawValue’sunu takiben artırımlı olarak devam edecektir.

CustomStringConvertible

Oluşturduğumuz enum’ın bir Int tipi rawValue’su olmasını istiyor ve aynı zamanda da anlamlı bir “String” tanım vermek istiyorsak “CustomStringConvertible” protokolüne uymasını sağlayabiliriz.

Örneğin aşağıdaki örnekte haftanın günlerine Pazartesiden itibaren 1,2…,7 olacak şekilde rawValue verdik. Aynı zamanda bir extension yazarak “CustomStringConvertible” protokolüne uydurduk ve hafta içi ve hafta sonu için özel tanımlarını yaptık.

Peki şimdiye kadar sürekli bir case’in oluşturulması yönünü inceledik. Şimdi de biraz elimizde oluşmuş case’e ait işlemleri nasıl yaparız sorusuna cevap arayalım.

switch-case

Elimizde bir case var ise bunu bir switch-case kontrolü ile kullanabiliriz.

Yukarıdaki kod parçasında pazar gününe özel bir mesaj vermek istiyoruz ve aşağıdaki gibi bir sonuç alıyoruz.

if case

switch-case kullanımı dışında “if-case” kullanarak da çözüm arayabiliriz. Genel olarak çok fazla case var ise ve küçük bir kısmına yönelik çalışmak istiyorsam bunu tercih ediyorum.

Enum with Associated values

Enum’lar içerisinde bulunan her bir case kullanılacağı yere kendisiyle beraber bazı değerler de götürebilir. Örneğin bir vergi türünü kontrol ederken aynı zamanda miktarına da bakmak istediğimizi düşünelim. Bu durumda case içerisinde “Double”, “Int” farketmez nasıl bir kurgu yapıyorsak, miktar değerini de götürür.

Ardından elde edilen bir gelir vergisi oluşturup, tutar değerimizi nasıl gönderiyoruz görelim.

Kod parçasının sonucu olarak da yukarıdaki gibi bir çıktı elde edeceğiz.

 

Bir cevap yazın