İçeriğe geç
Educora
Orta16 dk4 / 14

Opsiyoneller: değer olmayabilir

Swift'te “değer yok” durumunu opsiyonellerle güvenle yönet: `nil`, `if let`, `guard let`, `??` ve opsiyonel zincirleme.

Kendini test et
Bu derste öğreneceklerin
  • Opsiyonel türün (Int?, String?) ve nil'in ne olduğunu açıklamak
  • Opsiyoneli if let ve guard let ile güvenle açmak
  • ?? ile varsayılan değer vermek ve ?. ile opsiyonel zincirleme kurmak

Telefonundaki kişilerin bazılarının e-posta adresi var, bazılarının yok. Bir kullanıcı yaş alanına “15” yerine “on beş” yazabilir; bu metni sayıya çevirmek mümkün değildir. Programlar her gün böyle “değer yok” durumlarıyla karşılaşır. Birçok dilde bu, beklenmedik çökmelere yol açar; Swift ise bunun için özel bir araç sunar: opsiyoneller.

Opsiyonel nedir?

Tanım
Opsiyonel

Ya belirli türde bir değer tutan ya da hiçbir şey tutmayan (nil) bir tür. Tür adından sonra soru işaretiyle yazılır: Int?, “ya bir Int ya da nil” demektir.

Sıradan bir Int değişkeni asla boş olamaz; Swift bunu garanti eder. Bir değer eksik olabiliyorsa tür opsiyonel tanımlanır. Örneğin Int("42") bir diziyi sayıya çevirmeye çalışır ve sonuç Int? türündedir, çünkü dönüşüm başarısız olabilir.

Swift
let age = Int("42")
let wrong = Int("hello")
var middleName: String? = nil
middleName = "Ali"

print(age)
print(wrong)
print(middleName)
Beklenen çıktı
Optional(42)
nil
Optional("Ali")

Dikkat et: bir opsiyonel yazdırıldığında değer Optional(...) “kutusunun” içinde görünür ve Xcode sarı bir uyarı gösterir. Kutudaki değeri kullanmak için önce onu açman (İngilizcesiyle unwrap) gerekir. Doğrudan age + 1 yazamazsın, çünkü Int? ile Int toplanamaz.

`if let` ve `guard let` ile açmak

if let kontrol eder: opsiyonelin içinde bir değer varsa onu yeni bir sabite yazar ve bloğu çalıştırır; nil ise else bloğu çalışır. Bloğun içinde number artık sıradan bir Int'tir.

Swift
let input = "15"

if let number = Int(input) {
    print("Next year you will be \(number + 1).")
} else {
    print("That is not a number.")
}

let nickname: String? = nil
if let nickname {
    print("Hi, \(nickname)!")
} else {
    print("No nickname yet.")
}
Beklenen çıktı
Next year you will be 16.
No nickname yet.

guard let tersine çalışır: değer yoksa else bloğu çalışır ve mevcut koddan mutlaka çıkmalıdır (return, break ya da continue ile). Değer varsa açılan ad, guard'dan sonraki tüm kodda kullanılabilir. Genellikle fonksiyonlarda kullanılır; fonksiyon, adı olan bir kod bloğudur ve onu ileride ayrı bir derste ayrıntılı öğreneceksin.

Swift
func greet(_ name: String?) {
    guard let name else {
        print("Hello, guest!")
        return
    }
    print("Hello, \(name)!")
    print("Your name has \(name.count) letters.")
}

greet("Aysel")
greet(nil)
Beklenen çıktı
Hello, Aysel!
Your name has 5 letters.
Hello, guest!

`??` ve opsiyonel zincirleme

?? operatörü bir varsayılan değer verir: solda bir değer varsa o kullanılır, nil ise sağdaki değer alınır. ?. ise opsiyonel zincirlemedir: opsiyonelin bir özelliğine ya da metoduna yalnızca değer varken erişir; nil olduğunda bütün ifade sessizce nil döndürür.

Swift
let savedName: String? = nil
let displayName = savedName ?? "Anonymous"
print(displayName)
print(Int("abc") ?? 0)

let email: String? = "leyla@example.com"
let noEmail: String? = nil
print(email?.count)
print(noEmail?.count)
print(email?.uppercased() ?? "no email")
print(noEmail?.uppercased() ?? "no email")
Beklenen çıktı
Anonymous
0
Optional(17)
nil
LEYLA@EXAMPLE.COM
no email

Dikkat et: email?.count sıradan bir Int değil, Int? döndürür; zincirin bir halkası nil olabiliyorsa sonuç da opsiyonel olur. Bu yüzden ?. ve ?? çoğu zaman birlikte kullanılır.

YöntemNe yaparGüvenli mi?
if let x = optdeğer varsa bloğu çalıştırırevet
guard let x = opt else { … }değer yoksa koddan çıkarevet
opt ?? defaultnil yerine varsayılan değer verirevet
opt?.propertyyalnızca değer varken erişirevet
opt!zorla açar; nil ise program çökerhayır
Opsiyoneli açmanın yolları

Önemli noktalar

  • T? türü ya T türünde bir değer ya da nil tutar; sıradan türler asla nil olmaz.
  • if let değer varsa bloğu çalıştırır; guard let değer yoksa koddan çıkar.
  • ??, nil yerine varsayılan değer verir: Int("abc") ?? 0 → 0.
  • ?. zincirlemesinin sonucu da opsiyoneldir.
  • ! ile zorla açma nil durumunda programı çökertir; ondan kaçın.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Int("25") ifadesinin türü nedir?