将计算属性从Category转换为Swift Extension

时间:2015-05-08 15:16:49

标签: ios objective-c swift

我有以下目标-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,我不确定角色实际上做了什么?

这是翻译计算属性的正确方法吗?

1 个答案:

答案 0 :(得分:1)

你问:“这是翻译计算属性的正确方法吗?”

嗯,没有。

您正在做的不是翻译计算属性。看起来您正在使用关联对象来模拟扩展中的存储属性。

如果这是您的意图(将存储的属性添加到您的UINavigationBar扩展名),那么您发布的代码应该有效。

AssociatedObjectHandle变量是一些使得相关值存储有效的“魔力”。您必须传入一些唯一变量的地址,该变量告诉Objective-C运行时获取/设置类的关联值时要使用的键。您只需创建一个静态变量,并在get / set关联值调用中使用它的地址。