Динамическая настройка willSet и didSet в Swift

Я вижу потенциал для использования willSet & didSet чтобы заменить части кода типа KVO, я бы использовал в Objective-C. Одним из преимуществ 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 ответ

Как насчет чего-то вроде этого:

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++, то есть прозрачный.

Другие вопросы по тегам