动态设置willSet&在Swift中做过

时间:2014-08-03 06:02:23

标签: swift dynamic didset

我发现有可能使用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
    })
  }
}

1 个答案:

答案 0 :(得分:3)

这样的事情怎么样:

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")

我尝试将转化运算符添加到ModelObserver:&#34; func __conversion() - &gt; T&#34;,但似乎此功能不再有效。我不确定是否有解决办法。理想情况下,它可以像C ++智能指针一样,也就是说 - 透明。