經(jīng)常為了類(lèi)的使用方便,需要為類(lèi)添加一些附加屬性积担,或者額外的方法陨晶。由于iOS的類(lèi)的存儲(chǔ)結(jié)構(gòu)的原因,編譯器不會(huì)為類(lèi)別的屬性生成默認(rèn)的get帝璧,set方法先誉。因此類(lèi)別中的屬性需要使用動(dòng)態(tài)運(yùn)行時(shí)的方式實(shí)現(xiàn)湿刽。
類(lèi)似:
@interface CheckViewController (ToastView)
@property (nonatomic) BOOL hasToastView;
@end
static void *hasToastViewKey = &hasToastViewKey;
static void *activeKey = &activeKey;
@implementation CheckViewController (ToastView)
- (void)setHasToastView:(BOOL)hasToastView_
{
objc_setAssociatedObject(self, &hasToastViewKey, @(hasToastView_), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)hasToastView
{
return [objc_getAssociatedObject(self, &hasToastViewKey) boolValue] ? : NO;
}
@end
在swift中對(duì)應(yīng)的實(shí)現(xiàn)例子(此處屬性為block)
private var DescriptiveName = "handle"
extension UIView {
private var eventHanlerColsure : ()->() {
get {
guard let handler = objc_getAssociatedObject(self, &DescriptiveName) as? ()->() else {
return {()->Void in
};
}
return handler;
}
set(newHandle) {
objc_setAssociatedObject(self, &DescriptiveName, newHandle, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
}
或者
extension UIView {
private struct AssociatedKeys {
static var DescriptiveName = "handle"
}
private var eventHanlerColsure : ()->() {
get {
guard let handler = objc_getAssociatedObject(self, &AssociatedKeys.DescriptiveName) as? ()->() else {
return {()->Void in
};
}
return handler;
}
set(newHandle) {
objc_setAssociatedObject(self, &AssociatedKeys.DescriptiveName, newHandle, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
}
在swift中是為屬性聲明內(nèi)聯(lián)的get,set方法,使用動(dòng)態(tài)運(yùn)行時(shí)綁定的方法與類(lèi)實(shí)現(xiàn)property的關(guān)聯(lián)褐耳。此時(shí)key必須是const類(lèi)型的诈闺,編譯期生成標(biāo)志不變,程序運(yùn)行期間铃芦,key值地址不能發(fā)生變化雅镊,因此可以使用以上兩種方式定key值。