4

willSet&didSetを使用して、Objective-C で使用する KVO タイプのコードの一部を置き換える可能性があると考えています。Objective-C の利点の 1 つは、そのダイナミズム、特に実行時に動作を作成できることです。willSet&didSetが私にとって有用であるためには、それらの動作を動的に割り当てることができる必要があります。それらの「コンテンツ」またはそれらが具現化する動作を動的に設定することは可能ですか? ユース ケースの 1 つは、モデルのプロパティをビューにバインドすることです。擬似コード:

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
    })
  }
}
4

1 に答える 1

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 に変換演算子「func __conversion() -> T」を追加してみましたが、この機能が使えなくなったようです。回避策があるかどうかはわかりません。理想的には、C++ スマート ポインターのように機能する、つまり、透過的であることができます。

于 2014-09-18T21:04:56.703 に答える