由于swift中的extension不可以擴展存儲屬性。于是看到了這兩個方法。
這兩個函數都有associate,意思就是關聯。
public func objc_setAssociatedObject(object: AnyObject!, _ key: UnsafePointer, _ value: AnyObject!, _ policy: objc_AssociationPolicy)
public func objc_getAssociatedObject(object: AnyObject!, _ key: UnsafePointer) -> AnyObject!
objc_setAssociatedObject可以將object和value關聯起來。為了可以日后找到這個關聯關系,這里就需要定義一個key。還有關聯的策略policy
enum {
case OBJC_ASSOCIATION_ASSIGN ,
case OBJC_ASSOCIATION_RETAIN_NONATOMIC ,
case OBJC_ASSOCIATION_COPY_NONATOMIC ,
case OBJC_ASSOCIATION_RETAIN ,
case OBJC_ASSOCIATION_COPY
};```
objc_getAssociatedObject就可以利用key找到關聯到object上的那個對象。
這里當把object和value關聯起來以后,這個value就相當于object的一個屬性一樣的存在。
例如:
private struct AssociatedKeys {
static var itemName = "itemName"
}
extension MKAnnotation {
var itemName: String! {
get {
guard let str = objc_getAssociatedObject(self, &AssociatedKeys.itemName) as? String else { return nil }
return str
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.itemName, String(newValue),.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
還看到有文章寫到可以利用這兩個函數傳值,或者給button增加一個blockHandler,還可以做其他好多事,暫時沒有接觸到。