我有以下目标-c类别:
@implementation UINavigationBar (Awesome)
static char overlayKey;
static char emptyImageKey;
- (UIView *)overlay
{
return objc_getAssociatedObject(self, &overlayKey);
}
- (void)setOverlay:(UIView *)overlay
{
objc_setAssociatedObject(self, &overlayKey, overlay, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
我试图将它翻译成这样的Swift扩展名:
var AssociatedObjectHandle: UInt8 = 0
extension UINavigationBar {
var overlay:UIView! {
get {
return objc_getAssociatedObject(self, &AssociatedObjectHandle) as! UIView
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
}
}
看起来很奇怪,因为我创建了一个全局变量AssociatedObjectHandle
,我不确定角色实际上做了什么?
这是翻译计算属性的正确方法吗?
答案 0 :(得分:1)
你问:“这是翻译计算属性的正确方法吗?”
嗯,没有。
您正在做的不是翻译计算属性。看起来您正在使用关联对象来模拟扩展中的存储属性。
如果这是您的意图(将存储的属性添加到您的UINavigationBar扩展名),那么您发布的代码应该有效。
AssociatedObjectHandle
变量是一些使得相关值存储有效的“魔力”。您必须传入一些唯一变量的地址,该变量告诉Objective-C运行时获取/设置类的关联值时要使用的键。您只需创建一个静态变量,并在get / set关联值调用中使用它的地址。