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