如何在Swift扩展中创建弱存储属性?

时间:2014-12-24 07:00:28

标签: swift

Swift不支持扩展中的存储属性。解决这个问题的方法是按照建议here使用objc_setAssociatedObject。我要做的是创建一个存储属性,这是一个归零的弱引用。请注意,使用OBJC_ASSOCIATION_ASSIGN是不够的,因为在取消分配对象时它不会将引用归零。

我需要等同于

的东西
extension MyClass {
    weak var myVar: NSObject?
}

1 个答案:

答案 0 :(得分:0)

我探讨了使用obj_storeWeakobjc_loadWeak但最终只使用了包装类:

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
            }
        }
    }
}