Swizzle swift属性getter / setter

时间:2015-04-17 07:50:15

标签: objective-c swift

我有一个数据模型类层次结构,其基类在Objective-C中实现并继承自NSObject,我在其中重定向属性getter和setter以访问NSDictionary而不是存储ivars。我通过在运行时动态替换getter和setter实现来做到这一点。

这在Objective-C世界中运行良好,我的自定义getter和setter被调用。

但是,它并不适用于Swift。当我在Swift中定义一个继承的模型类时:

class ScreenItem : BaseModel {
    var identifier : String?
    var group : String?
    var sort : String?
}

其中BaseModel是我的Obj-C基类,Obj-C运行时可以看到identifiergroupsort setter和getter方法,我可以交换它们的实现。从Obj-C上下文中访问属性时,我的自定义getter会被调用。但是在Swift上下文中,访问该属性只是访问底层的ivar。 (有趣的是,BaseModel类上的@property因此被重定向,也适用于Swift上下文。它只是Swift类中不起作用的属性。)

如何让Swift使用Objective-C getter和setter?我可以通过在所有模型类中使用Objective-C来解决这个问题,但我真的很想在Swift中定义它们。

1 个答案:

答案 0 :(得分:4)

好的,自我回答是因为我弄清楚了:它足以宣布变量是动态的。

class ScreenItem : BaseModel {
    dynamic var identifier : String?
    dynamic var group : String?
    dynamic var sort : String?
}

我认为从Obj-c-class继承就足够了,添加@objc指令也无济于事。