Optional'larla çalışırken kendimizi biraz acemi hissederiz bazen ve açmalar (unwrapping), kontrol etmeler o kadar büyük bir yük haline gelir ki, çalışmaya devam edebilmek için birkaç tane ünlem işareti fırlatmak gelir içimizden. Siz yine de dikkatli olun: Eğer bir değer içermeyen bir optional'ı açmaya zorlarsanız, yazdığınız kod çöker.
Swift dili, kodunuzdaki karmaşayı azaltmaya yardım etmek için iki tekniğe sahiptir. İlkinin adı, sadece optional'ınızın bir değeri varsa kodunuzun çalışmasına izin veren Optional Chaining'tir. Alttaki kodu oyun alanınıza girin ve başlayalım:
func albumReleased(year: Int) -> String? {
switch year {
case 2006: return "Taylor Swift"
case 2008: return "Fearless"
case 2010: return "Speak Now"
case 2012: return "Red"
case 2014: return "1989"
default: return nil
}
}
let album = albumReleased(year: 2006)
print("The album is \(album)")
Bu kod sonuç paneline "The album is Optional("Taylor Swift")" yazdıracaktır.
Eğer albumReleased()
fonksiyonunun döndürdüğü değeri büyük harf olarak ("Taylor Swift" yerine "TAYLOR SWIFT") değiştirmek isteseydik, bu String'in uppercased()
metodunu çağırırdık. Örneğin:
let str = "Hello world"
print(str.uppercased())
Sorun ise, albumReleased()
fonksiyonunun optional bir String döndürmesidir: Bir String döndürebilir de, hiçbir şey döndürmeyebilir de. Söylemek istediğimiz şey şu: "Eğer bir String dönüyorsa büyük harflere dönüştür, aksi taktirde birşey yapma." İşte burada söze optional chaining giriyor, çünkü kendisi tam da bu şekilde davranıyor.
Kodunuzun son iki satırını, aşağıdaki gibi değiştirmeyi deneyin:
let album = albumReleased(year: 2006)?.uppercased()
print("The album is \(album)")
Optional chaining yapan soru işaretine dikkat edin: Bu soru işaretinden sonra gelen her şey çalışacak, ama tabi soru işaretinden öncekiler bir değer içeriyorsa. Bu, album
değişkeninin veri tipini etkilemez, çünkü bu kod satırı ya nil değerini döndürecek, ya da albümün adının büyük harfli versiyonunu; sonuçta hala optional bir String.
Optional chaining istediğiniz kadar uzun olabilir. Örneğin:
let album = albumReleased(year: 2006)?.someOptionalValue?.someOtherOptionalValue?.whatever
Swift, bir noktada duracağı nil değerini bulana kadar soldan sağa hepsini kontrol eder.
Swift'in bu özelliği basit görünmesine rağmen, kodunuzu daha basit ve daha güvenli hale getirir. Bakmayın siz birçok insanı korkutan görkemli ismine. Bu bir ayıptır, çünkü ne olduğunu anlamak için zaman ayırırsanız, nil değeri birleştirme operatörünün hayatınızı ne kadar çok kolaylaştıracağını göreceksiniz!
Yaptığı şey hakkında şöyle söyleyebiliriz: "Mümkünse A değerini kullan, ama A değeri nil ise, o zaman B değerini kullan." Bu kadar işte. Özellikle optional'larla birlikte çok kullanışlıdır, çünkü non-optional (seçimli olmayan) B değerini verdiğiniz için, onları optional olmaktan etkili bir şekilde kurtarır. Yani, eğer A bir optional ise ve bir değere sahipse, onu kullanacaktır (çünkü bir değerimiz var). Ama eğer A kendisi varken ama bir değere sahip değilse, B kullanılacaktır (hala bir değere sahibiz). Her halükarda, kesinlikle bir değere sahibiz.
Daha gerçekçi bir durum vermek için, aşağıdaki kodu oyun alanınızda deneyin:
let album = albumReleased(year: 2006) ?? "unknown"
print("The album is \(album)")
Bu bir çift soru işareti, nil birleştirme operatörüdür ve buradaki anlamı "albumReleased()
fonksiyonu bir değer döndürürse, onu album
değişkenine yerleştir. Ama eğer albumReleased()
fonksiyonu herhangi bir değer döndürmezse, dönen nil değeri yerine 'unknown' (bilinmeyen) değerini kullan."
Eğer şimdi sonuç paneline bakarsanız, "The album is Taylor Swift" yazdığını göreceksiniz; artık Optional ifadesi yok. Bu şekilde yazdırmasının sebebi, Swift'in artık fonksiyonun döndüreceği ister bir değer olsun, isterse 'unknown' olsun, gerçek bir şey alabileceğinden emin olmasıdır. Bunun anlamı, herhangi bir şeyi açmanıza gerek olmadığı, dolayısıyla da çökme riskinin olmadığıdır. Kodunuzu daha güvenli ve çalışması daha kolay bir hale getiren gerçek bir veriye sahip olduğunuz artık kesin.
SPONSORED Take the pain out of configuring and testing your paywalls. RevenueCat's Paywalls allow you to remotely configure and A/B test your entire paywall UI without any code changes or app updates.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.