Swift'te Enum — nedir, söz dizimi ve kullanımı

Yazar: IT Sectr Yayınlanma: 2026-06-17 Okuma süresi: 6 dk

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 — ilişkili değerler grubu için bir tür, tip güvenliği sağlar
  • Raw Values — tüm numaralandırma durumlarına atanan aynı türdeki değerler
  • Associated Values — her duruma ayrı ayrı eklenen farklı veri türleri
  • Durumlar case anahtar sözcüğüyle bildirilir ve metot içerebilir
  • Switch ile enum, derleyici tarafından tüm durumların kapsamlı şekilde incelenmesini gerektirir

Swift'te Enum Nedir?

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 Bildirim Söz Dizimi

Enum, enum anahtar sözcüğüyle, ardından bir ad ve küme parantezleri içinde gövde ile bildirilir.

swift
enum CompassDirection {
    case north
    case south
    case east
    case west
}

Durumlar tek bir satırda virgülle ayrılarak bildirilebilir:

swift
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:

swift
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.

Numaralandırmalarda Raw Values

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.

swift
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:

swift
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.

Enum'da Associated Values

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.

swift
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:

swift
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 (indirect)

Ö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.

swift
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:

swift
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 ve Protokoller

Enum, yapılar ve sınıflar gibi protokollere uyum sağlayabilir. Bu, Swift'te protokol odaklı programlamanın temel bir özelliğidir.

swift
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

Swift'te enum ile struct arasındaki fark nedir?

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.

Bir enum aynı anda hem raw values hem de associated values içerebilir mi?

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.

Bir enum'un tüm durumlarının dizisini nasıl alabilirim?

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.

Enum'u işlemek için switch kullanmak zorunlu mu?

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.

Generic'lerle enum oluşturulabilir mi?

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

  • Enum Swift'te metot, generic ve protokol desteğiyle tam teşekküllü bir türdür
  • Raw Values tüm durumlar için aynı türde değerler ayarlamaya olanak tanır
  • Associated Values her duruma farklı veriler bağlama imkanı sağlar
  • Indirect durumlar enum'da özyinelemeli yapılar için gereklidir
  • Protokoller enum tarafından uygulanabilir — bu Swift'te POP'un temelidir
  • Switch ile enum, derleme zamanında tüm durumların kapsamlı şekilde işlenmesini garanti eder
  • Sonlu durumları ve tip güvenli seçenekleri modellemek için enum kullanın

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.

Projeyi tartış

Ayrıca okuyun