美文网首页
Swift 中为一个扩展添加实例变量

Swift 中为一个扩展添加实例变量

作者: TomatosX | 来源:发表于2017-08-07 18:03 被阅读25次

    众所周知,在扩展中是不能为其添加实例变量的,那么如果非要加一个实例变量呢?我们可以用property配合Associated Object的方式,将一个对象关联到已有的要扩展的类上。

    class MyClass {}
    
    private var key: Void?
    
    extension MyClass {
      
        var title: String? {
            get {
                return objc_getAssociatedObject(self, &key) as? String
            }
            set {
                objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            }
        }
    }
    
    let my = MyClass()
    my.title // nil
    
    my.title = "Hello"
    my.title // Hello
    

    key 的类型在这里声明为了 Void?,并且通过 & 操作符取地址并作为 UnsafePointer<Void> 类型被传入。这在 Swift 与 C 协作和指针操作时是一种很常见的用法。

    相关文章

      网友评论

          本文标题:Swift 中为一个扩展添加实例变量

          本文链接:https://www.haomeiwen.com/subject/mnvalxtx.html