由于swift中的extension不可以擴(kuò)展存儲(chǔ)屬性。于是看到了這兩個(gè)方法捐名。
這兩個(gè)函數(shù)都有associate闹击,意思就是關(guān)聯(lián)。
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關(guān)聯(lián)起來贺归。為了可以日后找到這個(gè)關(guān)聯(lián)關(guān)系,這里就需要定義一個(gè)key琼腔。還有關(guān)聯(lián)的策略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找到關(guān)聯(lián)到object上的那個(gè)對(duì)象踱葛。
這里當(dāng)把object和value關(guān)聯(lián)起來以后,這個(gè)value就相當(dāng)于object的一個(gè)屬性一樣的存在甥材。
例如:
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)
}
}
還看到有文章寫到可以利用這兩個(gè)函數(shù)傳值洲赵,或者給button增加一個(gè)blockHandler商蕴,還可以做其他好多事,暫時(shí)沒有接觸到苛谷。