Swift 动态设置willSet&;迪德斯威夫特

Swift 动态设置willSet&;迪德斯威夫特,swift,dynamic,didset,Swift,Dynamic,Didset,我看到了使用willSet&didSet替代我在Objective-C中使用的部分KVO类型代码的潜力。Objective-C的好处之一是它的动态性,特别是在运行时创建行为的能力。为了使willSet和didSet对我有用,我需要能够动态分配它们的行为。是否有可能设置它们的“内容”或动态体现的行为?一个用例是将模型的属性绑定到视图。在伪代码中: mvvm = new MVVM(packageModel, 'url', packageView, 'urlLabel') class MVVM {

我看到了使用
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
    })
  }
}

像这样的怎么样:

println("begin")

import Swift


class Observable<T> {
    typealias ChangeNotifier = (T) -> ()

    init(t:T) { self.value = t }

    var value:T { didSet {
        for n in notifiers {
            n(self.value)
        }
    }}

    func subscribe(notifier:ChangeNotifier) {
        notifiers.append(notifier)
    }

    private var notifiers: [ChangeNotifier] = []

}



class ViewModel {
    var numberOfSheep:Observable<Int> = Observable<Int>(t:1)
}

class ViewController {
    var viewModel:ViewModel? = nil { didSet {
        viewModel?.numberOfSheep.subscribe(){ t in
            println("value is now \(t)")
        }}}
}

var vc = ViewController()
var vm = ViewModel()
vc.viewModel = vm

vm.numberOfSheep.value = 2
vm.numberOfSheep.value = 3


println("end")
println(“开始”)
进口雨燕
类可观测{
typealias ChangeNotifier=(T)->()
init(t:t){self.value=t}
var值:T{didSet{
对于通知程序中的n{
n(自我价值)
}
}}
func订阅(通知程序:更改通知程序){
append(通知程序)
}
专用变量通知程序:[ChangeNotifier]=[]
}
类视图模型{
var numberOfSheep:可观测=可观测(t:1)
}
类视图控制器{
var viewModel:viewModel?=nil{didSet{
viewModel?.numberOfSheep.subscribe(){t在中
println(“值现在是\(t)”)
}}}
}
var vc=ViewController()
var vm=ViewModel()
vc.viewModel=vm
vm.numberOfSheep.value=2
vm.numberOfSheep.value=3
println(“结束”)

我尝试向ModelObserver添加一个转换操作符:“func _conversion()->T”,但似乎该功能不再有效。我不确定是否有解决办法。理想情况下,它可以像一个C++智能指针,也就是说透明。斯威夫特没有KVO,我不确定苹果是否有官方消息称这种架构将如何改变。例如,您完全可以保留一个属性更改的侦听器列表(基本上是一个函数数组)。根据我在操场上的测试,Swift确实有KVO,因为NSObject有KVO,Swift有NSObject。我可以这样做,但我想利用willSet和didSet。到目前为止,我可以做到一半。如果我可以动态访问willSet的上下文,就像在获取要设置的密钥时一样,我会更接近。您是否可以在模型对象中/之前插入代理或筛选器,以便它在转发到模型之前监视更改?您必须从一个由数据支持的门面开始,并在两者之间进行注入,这样门面就不会改变。(穷人的KVO,我意识到)还有,苹果公司在devforums.Apple.com上发布了一条帖子,为未来的功能征求意见——你可能想参与进来。我认为这是一项很有价值的技术,但我不知道它如何允许我动态地呼叫分配给特定密钥/专有名的订阅者,而无需总是在每个密钥的
didSet
中手动键入密钥名观察到的属性。使用类似JavaScript的语言中的KVO或setter,我可以访问setter中键名的上下文。在Swift中,
didSet
中没有键名上下文。我希望能够在
didSet
中做一些事情,比如
notifiers[currentKey](newValue)
而不是
notifiers['numberOfSheep'](newValue)