İçeriğe geç

Swift 4 ile WritableKeyPath kullanımı

Merhabalar bu yazımda sizlere Swift 4 ile entegre olan güzel bir özellik olan KeyPath özelliğini sınıflarımıza protocol entegreli nasıl yazarız bunun örneğini vereceğim.

Swift dili her yeni versiyonunda oldukça güzel eklemeler yaparak programlamaya oldukça işlevsel yetenekler kazandırmakta. Bunlardan biride KeyPath özelliği. Bu yeniliklerle farklı tür tasarım kalıpları yazılabilir ve kullanılabilinir.

Aşağıdaki vereceğim örnekler sizler için oldukça yararlı olacaktır. İlk vereceğim örnekte KVO (Key Value Observing) yapısında observe işlemi gerçekleştireceğiz. Bu işlem için KeyPath kullanımını hatırlayacağız.

class Human: NSObject {
    
    let name: String
    
    @objc dynamic var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
        super.init()
    }
    
    func celebrateBirthday() {
        age += 1
    }
}

let humanObj = Human(name: "Kenan Atmaca", age: 22)

let observe = humanObj.observe(\Human.age, options: [.initial,.old]) { (child, change) in
    if let oldVal = change.oldValue {
        print("isim -> \(child.name) yaş - > \(child.age)  eski yaş = \(oldVal)")
    } else {
        print("isim -> \(child.name) yaş -> \(child.age)")
    }
}

humanObj.celebrateBirthday()
humanObj.celebrateBirthday()

Çıktısı:

isim -> Kenan Atmaca yaş -> 22
isim -> Kenan Atmaca yaş - > 23  eski yaş = 22
isim -> Kenan Atmaca yaş - > 24  eski yaş = 23

Hatırlatma olarak sınıf içerisine nesneye bağlı tetikleme işlemi gerçekleştirmek istiyorsanız.  @objc dynamic yapıda bir değişken kullanmanız gerekir ve sınıfınz alt sınıf olarak NSObject eklenmelidir. Sınıf içerisindeki age değişkenini observe fonksiyonuna keyPath olarak gönderdik ve tetiklenme işlemini kontrol ederek ekrana yazdırdık.

Diğer örneğimde ise generics yapısının esnekliğinden yararlanacak ve Başlıktaki gibi WritableKeyPath nasıl kullanılır bunu görmüş olacaksınız.

Örneğe bakalım.

protocol Identifiable {
    associatedtype id
    static var idKey: WritableKeyPath<Self, id> { get }
}

struct User: Identifiable {
    
    static let idKey = \User.no // WritableKeyPath<User,no>
    
    var no:String!
    var name:String!
}

func printId<T: Identifiable>(_ obj: T) {
    print(obj[keyPath: T.idKey])
}

let userObj = User(no: String(describing: UUID.init()), name: "Kenan")

printId(userObj) // idKey

 

Tarih:SwiftSwift 4

Bu yazı yorumlara kapalı.

Copyright © 2020 Kenan Atmaca