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