Enumeration - 3

Enum’larda Fonksiyon ve Initializer Kullanımı

Swift’te enum’ların üye fonksiyonları olabileceği gibi parametrik olan veya olmayan initializer’ları da olabilir. Enum’lar içerisine initializer yazmanın gerekçesi; enum’a kendi sabitlerinden birisiyle ilk değer vermektir. Aşağıda “Bilimsel” isimli enum’a örnek olarak iki farklı init() yazılmıştır.

enum Bilimsel : Float {
case g = 9.28
case e = 2.71
case pi = 3.14
init() {
self = .pi }
init (prm:Bilimsel) {
self = prm } }


//Test

var sayi1 = Bilimsel()
print(sayi1.rawValue) //3.14
var sayi2 = Bilimsel(prm:Bilimsel.g)
print(sayi2.rawValue) // 9.28

Enum elemanları için farklı türler belirlenebilir. Örnek:

enum Meyve {
case Elma(Int)
case Karpuz(Double)
case Ayva
}

Swift derleyicisi enum türündeki bir değişken için o enum’ın en uzun eleman türü kadar yer ayırır.
Şayet enum elemanlarına tür bilgisi atanmışsa artık rawValue property’si tanımsız olur.
Hem enum’ın kendisine hem de elemanlarına tür bilgisi atanamaz.

enum Sebze {
case Domate(Int)
case Biber(Double)
case Kabak
}

var s: Sebze = .Biber(2.90)

switch s {
case .Domates(let a):
print(“Domates: \(a)”)
case .Biber(let b):
print(“Biber: \(b)”)
case .Kabak:
print(“Kabak”)
}

Enum elemanlarına iliştiren türler tuple da olabilir. Örnek:

enum Meyve {
case Armut(Int, Int, Int)
case Elma(Double)
case Ayva
}

var m:Meyve = .Armut(30,10,80)

Enum’da ki Durumları Diziye Çevirme

enum CompassDirection: CaseIterable {
    case north, south, east, west
}

print( CompassDirection.allCases.count) //4

let caseList = CompassDirection.allCases
    .map({ "\($0)" })
    .joined(separator: ", ")
// caseList == "north, south, east, west"