Optional Chaining Nedir ?

İlayda Öner
FLO Teknoloji
Published in
3 min readSep 28, 2023

Optional türler ve Optional Chaining, Swift’in bu amacını yerine getiren özelliklerden sadece birkaçıdır. Bu makalede, optional chaining’in ne olduğunu, nasıl çalıştığını ve Swift projelerinizde nasıl uygulanacağını inceleyeceğiz.

Optional Nedir?

Optional kelimesinin Türkçe karşılığı tercihe bağlı ya da seçmeli olduğu için aklımıza daha farklı kullanımlar gelebilir. Ancak programlama dilindeki karşılığı tam olarak öyle değil. Swift’te, bir değişkenin bir değere sahip olabileceği veya olmayabileceği (nil olabileceği) durumlar için optional türler kullanılır. Eğer bir değişkenin kesinlikle değer içerdiği biliniyorsa, optional türler kullanılamaz.

Aşağıdaki kısa örnekte bu durumu inceleyelim:

var name: String?  // 'name' bir String veya nil olabilir.

Bu, `name` değişkeninin bir `String` değeri taşıyabileceği veya hiçbir değeri olmayabileceği (nil) anlamına gelir.

Optional’ların Temel Kavramları

Optional’larla çalışırken, iki temel konseptle karşılaşırız: Unwrapping ve optional binding. Unwrapping, optional’ın içindeki değeri kullanmak için kullanılır, ve optional binding, optional’ın bir değere sahip olup olmadığını kontrol eder ve varsa, bu değeri bir geçici sabite veya değişkene atar.

Optional Binding yapabilmek için 2 işlemden faydanılır:

  1. if-let
  2. guard

Aşağıdaki örnekte , if-let ifadesi kullanılarak kontrollü bir şekilde optional veri alma işlemi yapılır. Bu ifade sayesinde unwrapping işlemine gerek kalmadan yani “!” işlecini kullanmamıza gerek kalmaz.

var name: String?
name = “ilayda”
if let firstName = name {
print(firstName)

}
var name: String?
name = "İlayda"
guard let firstName = name else {
return
}
print(firstName)

//guard kullanımı

guard let yapısının kullanıldığı örnekte firstName değişkeninin nil olma durumunda else bloğuna girer ve guard let yapısından sonraki kodlar okunmayacaktır.

Guard let ile if let kavramları arasındaki en temel fark; guard let ile kullanılan değişken global bir değişken, if let ile kullanılan değişken ise local değişken olur.

Optional Chaining Nedir?

Optional chaining, optional bir değeri sorgulamamıza ve methodlarını veya property’lerini güvenli bir şekilde erişmemize olanak tanır.

class Pet {
var name: String
init(name: String) { self.name = name }
}

class Person {
var pet: Pet?
}

let ilayda = Person()
let petName = ilayda.pet?.name
// petName otomatik olarak nil olur, çünkü ilayda.pet nil'dir.

Optional Chaining Kullanımı:

Optional chaining sayesinde, değerlerimiz nil ise hemen bu durumu tespit edebilir ve hataları önleyebiliriz.

if let petName = ilayda.pet?.name {
print(“Ilayda’s pet's name is \(petName)")
} else {
print(“Ilayda doesn't have a pet.")
}

Methods ve Optional Chaining:

Optional chaining, optional değerlerin methodlarını çağırırken de kullanılabilir.

class Pet {
var name: String
init(name: String) { self.name = name }

func speak() {
print("\(name) says havhav!”)
}
}

let myPet: Pet? = Pet(name: “Zeytin”)
myPet?.speak()

// Eğer myPet nil ise, hiçbir şey olmaz. Eğer nil değilse, "Zeytin says havhav!" yazdırılır.

Optional Chaining ile Subscripts:

Swift’de, optional chaining subscriptler ile de kullanılabilir.

extension Array {
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}

var numbers = [1, 2, 3, 4, 5]
let thirdNumber = numbers[safe: 2] // Optional(3)
let tenthNumber = numbers[safe: 9] // nil

Optional Chaining ile Multiple Levels:

Optional chaining, birden fazla seviye üzerinde de çalışabilir.

class Dog {
var toy: Toy?
}

class Toy {
var name: String
init(name: String) { self.name = name }
}

let zeytin = Dog()
let toyName = zeytin.toy?.name // toyName otomatik olarak nil olur, çünkü zeytin.toy nil'dir.

Nil Coalescing ile Birlikte Optional Chaining:

Nil coalescing, kontrollü optional veri açma durumunda nil hatası almamak için default value verilmesi durumudur ve (`??`) işleci optional chaining ile birlikte kullanıldığında, optional değerlerle daha güçlü ve esnek bir şekilde çalışmanızı sağlar.

let petName = ilayda.pet?.name ?? "No Pet"
print(“Ilayda’s pet's name is \(petName)") // Ilayda’s pet's name is No Pet

Swift’te optional chaining ve nil coalescing gibi özellikler, optional türlerle çalışırken kodumuzu daha güvenli, temiz ve anlaşılır hale getirmemize yardımcı olur. Optional chaining, bir optional değeri ve onun alt özelliklerini güvenli bir şekilde sorgulamamıza olanak tanır, böylece daha güçlü ve hatasız kodlar yazabiliriz. Swift’te optional chaining’in gücünü anlayarak, projelerimizi daha güvenli ve etkili bir şekilde geliştirebiliriz. Umarım yazımı okurken hem keyif alıp hem de fayda sağlayabilmişsinizdir.

--

--