İçeriğe geç

Extension stored properties kullanımı

Merhabalar bu yazımda Swift dilinde Extension işlemi yaparken sınıflara ek değişken nasıl ekleyebiliriz ? sorusunun çözümünü paylaşacağım.

Extension ile var olan sınıfları büyütmek ve geliştirmek kullandığımız ve oldukça Swift dilini işlevsel hale getiren bir yapı. Ancak Extension işleminde var olan sınıfa var olmayan bir nesne eklediğimiz zaman hata ile karşılaşırsınız. “extensions must not contain stored properties” bu yüzden extension ile değişken ekleme işlemini normal bir şekilde ekleyemeyiz.

Bunun için Objective-c run time lib içerisinde bulunan objc_getAssociatedObject ve objc_setAssociatedObject fonksiyonlarını kullanacağız.

Aşağıdaki yazdığım örnek üzerinde kullanımını görelim.

protocol UserProtocol: class {
    var name:String {get}
    var age:Int {get}
}

class User: UserProtocol {
    var name: String
    var age: Int
    
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
}

var tokenObcKey:UInt8 = 1

extension User {
    var token:String {
        get {
         return objc_getAssociatedObject(self, &tokenObcKey) as! String
        }
        set {
            objc_setAssociatedObject(self, &tokenObcKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

var usrObj = User(name: "Kenan", age: 23)
usrObj.token = UUID.init().uuidString
usrObj.token // ...

get ve set işlemi için bir key değeri eklemek zorundayız. Bu işlem KVO işlemindeki gibi context yapısına benzemekte. Set işleminde ise kaydedilecek nesnenin kaydedilme yapısını belirleyen objc_AssociationPolicy enumu.

  • OBJC_ASSOCIATION_ASSIGN: Nesneyi zayıf bir referansla kaydeder, bu şekilde tutma sayısını artırmaz.
  • OBJC_ASSOCIATION_RETAIN_NONATOMIC: Nesneyi atomik olarak güçlü bir referansla kaydeder.
  • OBJC_ASSOCIATION_COPY_NONATOMIC: Nesneyi atomik olarak kopyasını oluşturmadan kaydeder.
  • OBJC_ASSOCIATION_RETAIN: Nesneyi atomik olarak güçlü bir referansla kaydeder.
  • OBJC_ASSOCIATION_COPY: Nesneyi atomik olarak kopyasını oluştururken kaydeder.

Bizde örneğimizde OBJC_ASSOCIATION_RETAIN_NONATOMIC kullandık buda bildiğimiz var value:String ile aynı seviyededir.

 

 

 

 

Kategori:SwiftSwift 4

Bu yazı yorumlara kapalı.

Copyright © 2022 Kenan Atmaca