众所周知,在扩展中是不能为其添加实例变量的,那么如果非要加一个实例变量呢?我们可以用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 协作和指针操作时是一种很常见的用法。