Swift2 如何使用Swift实现双向绑定?

Swift2 如何使用Swift实现双向绑定?,swift2,couchbase-lite,Swift2,Couchbase Lite,如何使用Swift 2.0实现双向数据绑定 假设我有以下模型类(使用couchbase lite): 我喜欢将属性绑定到给定的formItemDescriptor,如下所示: class FormItemDescriptor { var tag: String? var value: Any? } let person: Person let nameLabel: UILabel person.rValueForKeyPath("firstName").bindTo(name

如何使用Swift 2.0实现双向数据绑定

假设我有以下模型类(使用couchbase lite):

我喜欢将属性绑定到给定的formItemDescriptor,如下所示:

class FormItemDescriptor {
    var tag: String?
    var value: Any?
}
let person: Person
let nameLabel: UILabel

person.rValueForKeyPath("firstName").bindTo(nameLabel)
如何使用双向绑定将
formitemscriptor.value
属性绑定到
Person.firstName
属性


因此,模型中的更改以表单的形式出现,反之亦然?

Swift不支持开箱即用的绑定,但您可以使用类似的框架来实现它们

例如,当您声明一个可观察属性时,您可以将其绑定到另一个可观察属性

let numberA: Property<Int>
let numberB: Property<Int>

numberA.bindTo(numberB)
现在,只要你改变其中一个,另一个就会改变

不过,您的示例有点难,因为您需要从@NSManaged属性进行绑定,而这些属性不能被
观察到。这不是不可能的,但是要工作,Person的属性应该支持键值观察(KVO)

例如,给定一个Person对象和一个标签,您可以使用方法
rValueForKeyPath
从启用KVO的属性中获取一个属性,然后将该可观察对象绑定到标签,如下所示:

class FormItemDescriptor {
    var tag: String?
    var value: Any?
}
let person: Person
let nameLabel: UILabel

person.rValueForKeyPath("firstName").bindTo(nameLabel)
如果您有一个中间对象,如
FormItemDescriptor
,则必须使其属性可见

class FormItemDescriptor {
  var tag: Property<String?>
  var value: Property<Any?>
}
因为
firstName
是不可见的,所以不能在另一个方向进行绑定,所以每当
value
发生变化时,必须手动更新它

descriptor.value.observeNext { value in
  person.firstName = value as? NSString
}
我们还必须对
NSString
进行强制转换,因为
value
属于
Any?
类型。不过,你应该重新考虑一下,看看能不能让它成为一种更强的类型


请注意,UIKit绑定来自ReactiveUIKit框架。有关更多信息,请查看我们的文档。

非常感谢您的详细解释!我曾考虑过两种绑定方式-
a.bindTo(b),b.bindTo(a)
,但害怕无休止的循环或任何其他奇怪的行为。因此,使用ReactiveKit进行这种双向绑定真的很省钱吗?是的,它是完全安全的-有一种内部机制,使得无休止的循环成为不可能。
descriptor.value.observeNext { value in
  person.firstName = value as? NSString
}