- Opsiyonel türün (
Int?,String?) venil'in ne olduğunu açıklamak - Opsiyoneli
if letveguard letile 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?
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.
let age = Int("42")
let wrong = Int("hello")
var middleName: String? = nil
middleName = "Ali"
print(age)
print(wrong)
print(middleName)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.
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.")
}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.
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)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.
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")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öntem | Ne yapar | Güvenli mi? |
|---|---|---|
if let x = opt | değer varsa bloğu çalıştırır | evet |
guard let x = opt else { … } | değer yoksa koddan çıkar | evet |
opt ?? default | nil yerine varsayılan değer verir | evet |
opt?.property | yalnızca değer varken erişir | evet |
opt! | zorla açar; nil ise program çöker | hayır |
Önemli noktalar
T?türü yaTtüründe bir değer ya daniltutar; sıradan türler aslanilolmaz.if letdeğer varsa bloğu çalıştırır;guard letdeğer yoksa koddan çıkar.??,nilyerine varsayılan değer verir:Int("abc") ?? 0→0.?.zincirlemesinin sonucu da opsiyoneldir.!ile zorla açmanildurumunda programı çökertir; ondan kaçın.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
Int("25") ifadesinin türü nedir?