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."