NEW: Join my free 100 Days of SwiftUI challenge today! >>

Optional chaining (Optional zincirleme)

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.

nil değeri birleştirme operatörü (nil coalescing operator)

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 Instabug helps you identify and resolve severe crashes quickly. You can retrace in-app events and know exactly which line of code caused the crash along with environment details, network logs, repro steps, and the session profiler. Ask more questions or keep users up-to-date with in-app replies straight from your dashboard. Instabug takes data privacy seriously, so no one sees your data but you! See more detailed features comparison and try Instabug's crash reporting SDK for free.

BUY OUR BOOKS
Buy Pro Swift Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift (Vapor Edition) Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Server-Side Swift (Kitura Edition) Buy Beyond Code

Was this page useful? Let us know!