【发布时间】:2014-08-03 06:02:22
【问题描述】:
我看到了使用willSet 和didSet 来替换我在Objective-C 中使用的部分KVO 类型代码的潜力。 Objective-C 的好处之一是它的活力,特别是在运行时创建行为的能力。为了让willSet 和didSet 对我有用,我需要能够动态分配他们的行为。是否可以设置它们的“内容”或它们动态体现的行为?一个用例是将模型的属性绑定到视图。在伪代码中:
mvvm = new MVVM(packageModel, 'url', packageView, 'urlLabel')
class MVVM {
init(model: Model, modelPropertyName : NSString, view: View, viewPropertyName : NSString) {
model.propertyDescriptor('willSet', modelPropertyName, (newUrl){
view[viewPropertyName].text = newUrl
})
}
}
【问题讨论】:
-
您似乎正在寻找 KVO 的替代品。 Swift 没有 KVO,我不确定 Apple 是否有关于这种架构将如何改变的官方消息。但是,您将完全能够,例如,保留属性更改的侦听器列表(这基本上是一个函数数组)。
-
根据我在操场上的测试,Swift 确实有 KVO,因为 NSObject 有 KVO,而 Swift 有 NSObject。我可以这样做,但我想利用 willSet 和 didSet。
-
到目前为止,我可以到达那里。如果我可以动态访问 willSet 的上下文,就像获取设置的键一样,我会更接近。
-
您能否在模型对象中/之前注入代理或过滤器,以便它可以在转发到模型之前观察更改?您必须从由数据支持的外观开始,然后在两者之间注入,这样外观就永远不会改变。 (我意识到穷人的 KVO)
-
另外,Apple 在 devforums.apple.com 上发布了一个帖子,为未来的功能征求意见 - 您可能需要权衡一下。