0

Swift doesn't support stored properties in extensions. A way around that is to use objc_setAssociatedObject as suggested here. What I'm trying to do is create a stored property that is a zeroing weak reference. Note that using OBJC_ASSOCIATION_ASSIGN is not enough because it will not zero the reference when the object is deallocated.

I need something equivalent to

extension MyClass {
    weak var myVar: NSObject?
}
Community
  • 1
  • 1
Alejandro
  • 3,726
  • 1
  • 23
  • 29

1 Answers1

0

I explored using obj_storeWeak and objc_loadWeak but ended up simply using a wrapper class:

internal class WeakWrapper : NSObject {
    weak var weakObject : NSObject?

    init(_ weakObject: NSObject?) {
        weakObject = weakObject
    }
}

extension MyClass {
    var myVar: NSObject? {
        get {
            var weakWrapper: WeakWrapper? = objc_getAssociatedObject(self, &associationKey) as? WeakWrapper
            return weakWrapper?.weakObject
        }
        set {
            var weakWrapper: WeakWrapper? = objc_getAssociatedObject(self, &associationKey) as? WeakWrapper
            if weakWrapper == nil {
                weakWrapper = WeakWrapper(newValue)
                objc_setAssociatedObject(self, &associationKey, weakWrapper, UInt(OBJC_ASSOCIATION_RETAIN))
            } else {
                weakWrapper!.weakObject = newValue
            }
        }
    }
}
Alejandro
  • 3,726
  • 1
  • 23
  • 29