Enum Swift'te, ilişkili değerler grubunu tek bir ad altında birleştiren bir türdür. C ve Objective-C'de enum yalnızca bir tamsayı sabitleri kümesiyken, Swift associated values, raw values, metotlar ve protokol desteği ile birinci sınıf numaralandırmalar sunar. Apple, 2026'ya göre enum, iOS geliştirmede tip güvenli durum modellemesinin anahtar araçlarından biridir.
Önemli Noktalar
Enum (numaralandırma), birbirini dışlayan seçeneklerin sonlu bir kümesini birleştiren özel bir veri türüdür. Swift'te enum yalnızca sayısal sabitler değil, kendi mantığı olan tam teşekküllü bir türdür.
Numaralandırmanın her seçeneğine durum (case) denir. Objective-C'de enum bir tamsayı türüne indirgenirken, Swift her durumun kendi verisini depolamasına ve metotlara sahip olmasına izin verir.
Apple'a göre Swift'te enum; generic'leri, başlatıcıları, hesaplanan özellikleri ve protokol uyumluluğunu destekler — bu da onu durumları, hataları, seçenekleri ve sonlu durum makinelerini modellemek için uygulanabilir kılar.
Enum'u, birbirini dışlayan seçeneklerin sonlu bir kümesini temsil etmeniz gereken her yerde kullanın: ekran durumları, hata türleri, yönler, filtreleme seçenekleri.
Enum, enum anahtar sözcüğüyle, ardından bir ad ve küme parantezleri içinde gövde ile bildirilir.
enum CompassDirection {
case north
case south
case east
case west
}
Durumlar tek bir satırda virgülle ayrılarak bildirilebilir:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
Bir duruma erişmek için, bilinen türden sonra nokta söz dizimini kullanın:
let direction = CompassDirection.north
// Tür biliniyor — kısa söz dizimi mevcut:
var currentPlanet = .earth
Bir değişkene bilinen bir enum türü atandığında, Swift türü otomatik olarak çıkarır ve durumlara erişirken numaralandırma adı atlanabilir.
Raw Values, her enum durumuna atanan tek bir türdeki değerlerdir. Associated values'ın aksine, raw values tüm durumlar için aynı türdedir ve bildirim sırasında tanımlanır.
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
Tamsayı raw values için, yalnızca ilki açıkça ayarlanmışsa Swift değerleri otomatik olarak artırır:
enum Status: Int {
case pending = 1
case active // 2
case completed // 3
}
Raw values; Int, String, Character türlerinde veya RawRepresentable protokolüne uyan herhangi bir türde olabilir. Swift, bir raw value'dan enum oluşturmak için init? başlatıcısını otomatik olarak üretir — API'lerden veri ayrıştırmak için kullanışlıdır.
Associated Values, her enum durumuna ayrı ayrı farklı veri türleri bağlamaya olanak tanır. Raw values'ın aksine, associated values tür ve miktar olarak farklılık gösterebilir.
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
Switch ile işleme sırasında, associated values değişkenlere veya sabitlere bağlama yoluyla çıkarılır:
let error = NetworkError.httpError(code: 403, message: "Forbidden")
switch error {
case .timeout(let seconds):
print("\(seconds)s saniye sonra zaman aşımı")
case .httpError(let code, let message):
print("HTTP \(code): \(message)")
case .noConnection:
print("Bağlantı yok")
case .unknown(let err):
print("Bilinmiyor: \(err.localizedDescription)")
}
Apple belgelerine göre, associated values enum'u ayrı sarmalayıcı türler oluşturmadan karmaşık durumları modellemek için etkileyici bir araç haline getirir. Result benzeri senaryolar ve bağlamlı hata modellemesi için kullanın.
Özyinelemeli Enum — durumları enum türünün kendisine başvuran bir numaralandırmadır. Bu tür durumlar indirect anahtar sözcüğüyle işaretlenir.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
enum'dan önce indirect kullanmak tüm durumları özyinelemeli olarak işaretler. Alternatif olarak, yalnızca belirli bir durum indirect ile işaretlenebilir:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swift, özyinelemeli durumları değerler yerine referanslar (referans semantiği) olarak depolamak için indirect kullanır — bu, yığında enum'un sonsuz boyutunu önler. Özyinelemeli enum'lar ağaç, bağlantılı liste ve AST oluşturmada yaygın olarak kullanılır.
Enum, yapılar ve sınıflar gibi protokollere uyum sağlayabilir. Bu, Swift'te protokol odaklı programlamanın temel bir özelliğidir.
protocol Describable {
var description: String { get }
}
enum PaymentMethod: Describable {
case creditCard(last4: String)
case applePay
case bankTransfer
var description: String {
switch self {
case .creditCard(let last4):
return "Card ending in \(last4)"
case .applePay:
return "Apple Pay"
case .bankTransfer:
return "Bank Transfer"
}
}
}
Enum ayrıca Cocoa protokollerine de uyum sağlayabilir — örneğin, tüm durumların koleksiyonunu otomatik oluşturmak için CaseIterable veya serileştirme için Codable. Bu, enum'u Swift uygulamalarında çok yönlü bir yapı taşı haline getirir.
Sıkça Sorulan Sorular
Enum, birbirini dışlayan seçeneklerin sonlu kümesine sahip bir türken, struct isteğe bağlı özellikler kümesine sahip bir türdür. Enum stored properties'e sahip olamaz, ancak computed properties ve metotları destekler.
Hayır, bir enum aynı anda hem raw values hem de associated values içeremez. Raw values tüm durumlar için aynı türde değerlerdir, associated values ise her durum için bireysel verilerdir. Bu mekanizmalar birbirini dışlar.
CaseIterable protokolüne uyumluluk ekleyin. Swift, bildirim sırasına göre tüm durumların bir koleksiyonunu döndüren allCases özelliğini otomatik olarak oluşturur. Bu, tüm seçenekler üzerinde yineleme yapmak için kullanışlıdır.
Switch en güvenli yaklaşımdır çünkü derleyici tüm durumların kapsandığını kontrol eder. Tek bir durumu kontrol etmek için if case veya associated values olmayan enum için == kullanabilirsiniz.
Evet, enum generic'leri destekler: enum Result<T, E> { case success(T); case failure(E) }. Bu, başarı ve hatayı işlemek için tip güvenli generic yapılar oluşturmayı sağlar.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun