Swift'te KeyPath

KeyPath'ler Swift 4 ile birlikte tanıtılan ve veri modeli property'lerine erişmek için kullanılan bir özelliktir. Bu yazıda, KeyPath'lerin ne olduğunu, nasıl kullanılacağını ve kullanım örneklerini açıklayacağım.

KeyPath Nedir?

KeyPath, bir objenin bir özelliğine doğrudan bir referans sağlamak için kullanılan bir yoludur. Bununla birlikte, property adının kendisi yerine, objenin property için bir referans sağlamak için bir yol olarak kullanılabilen özellikleri kullanır. KeyPath'lerin kullanılması, property isimlerinin doğrudan kullanılmasından daha güçlü bir şekilde tip güvenliği sağlar.

Bir örnek kullanarak açıklayalım. Aşağıdaki Person sınıfını ele alalım:


class Person {
    var name: String
    var surname: String
    var age: Int
    
    init(name: String, surname: String, age: Int) {
        self.name = name
        self.surname = surname
        self.age = age
    }
    
    func sayHello() {
        print("Hello, my name is \(name).")
    }
}

Bu sınıf, bir kişinin adı ve yaşı hakkında bilgi tutar. Şimdi, bir Person örneği oluşturalım:


let person = Person(name: "Furkan", surname: "Ozoglu", age: 32)

Bu örnekte, person değişkeni bir Person örneğini tutar. Şimdi, person'ın name property'lerine erişmek için KeyPath kullanalım:


let nameKeyPath = \Person.name
let name = person[keyPath: nameKeyPath]
print(name) // "Furkan"

Burada, nameKeyPath sabitini oluşturduk ve bu sabit, Person sınıfının name property'sine bir referans sağlar. Daha sonra, person örneği üzerindeki name property'sine erişmek için keyPath kullanılarak nameKeyPath sabiti kullanıldı.

Bu, property adını doğrudan kullanmak yerine, name propert'sine erişmek için bir referans sağlayan bir KeyPath kullanarak daha güçlü bir şekilde tip güvenliği sağlamış olduk.

KeyPath'leri özelliklerin okunması veya yazılması için kullanabilirsiniz. Yukarıdaki örnek property değerini okumak için kullanabiliriz.

Property değerini yazmak için, keyPath söz dizimini kullanarak bir özelliğe erişebilirsiniz:


let ageKeyPath = \Person.age
person[keyPath: ageKeyPath] = 35
print(person.age) // 35

Burada, ageKeyPath sabiti oluşturduk ve Person sınıfının age özelliğine bir referans sağlar.

Örneğin bir collection değerine erişmek istersek de:


let numbers = [1, 2, 3, 4, 5]
let evenNumberKeyPath = \Int.isMultiple(of: 2)

let evenNumbers = numbers.filter { $0[keyPath: evenNumberKeyPath] }
print(evenNumbers) // [2, 4]

Eğer bir fonksiyona erişmek istersek te yukaridaki örnekteki class içerisine tanımlanmiş fonksiyon çağırabilir.


let person = Person(name: "Furkan", surname: "Ozoglu", age: 32)
let sayHelloKeyPath = \Person.sayHello

person[keyPath: sayHelloKeyPath]() // "Hello, my name is Furkan."