Swift Optionals: nil Güvenliği ve Unwrapping Tuzakları
Swift'in en güçlü özellikleri arasında optionals (opsiyoneller) vardır. Bir değişken `nil` (boş/tanımsız) olabilir mi sorusuna kesin cevap vermeyi zorunlu kılar. Bu, çoğu dilde yaşanan "null reference" hatalarını baştan engeller.
Diyelim bir fonksiyon kullanıcı ID'sini arar. Bulmazsa ne döner? Swift'te bunu açıkça tanımlamalısın: ya bir değer var, ya da yok. bu durum `Optional` türüyle ifade edilir.
1let age: Int? = nil // Optional Int, nil olabilir2let name: String? = "Ali" // Optional String, değeri varSoruşturmak istersen: `age` değişkeni `Int?` türündedir, "belki bir tamsayı, belki değil" anlamına gelir.
1. Force Unwrapping (Tehlikeli)
1let age: Int? = 252print(age!) // Çıktı: 2534let empty: Int? = nil5print(empty!) // CRASH! Fatal errorEğer `nil` değere `!` uygulanırsa program çöker. Sadece 100% emin olduğunda kullan.
2. Optional Binding (Güvenli)
1let age: Int? = 2523if let unwrappedAge = age {4print("Yaş: \(unwrappedAge)") // Çıktı: Yaş: 255} else {6print("Yaş bilinmiyor")7}Değer varsa `unwrappedAge` içine koyar; yoksa `else` bloğu çalışır. En güvenli yol budur.
3. Nil Coalescing (Varsayılan Değer)
1let age: Int? = nil2let displayAge = age?? 0 // nil ise 0 kullan3print(displayAge) // Çıktı: 01let user: [String: Any]? = ["name": "Ahmet", "age": 30]2let name = user!["name"]! // İki!, çok riskli!Bu kodu yazarsan, `user` ya da sözlük içi `nil` olduğunda crash olur. Bunun yerine:
1if let user = user, let name = user["name"] {2print(name) // Güvenli3}`!` operatörü sadece test kodunda veya çok nadir durumlarda kullan. Gerçek uygulamada `if let`, `guard let` veya `??` tercih et. Swift'in amacı tam da budur: nil hatalarını compile zamanında yakalamak.
0 yorum