(适用于ReactiveCocoa
4或3)
在我见过的大多数示例和案例中,参与将用户界面连接到数据的ReactiveCocoa
对象(如MutableProperty<TVal, TErr>
或SignalProducer<TVal, TErr>
)至少在构造函数中调用的某些setupBindings
或类似方法中实例化。
我遇到过几种情况,当我将对象的声明从作用域移动到存储属性时,非工作代码突然"工作正常",反之亦然。例如,在伪代码中:
class Wtf {
// doesn't work
init() {
let prop = MutableProperty<Dah, Dah>()...
doSomethingWith(prop)
}
// also doesn't work
private let prop: MutableProperty<Dah, Dah> = MutableProperty<Dah, Dah>(Dah())
init() {
doSomethingWith(prop)
}
// works?
private let prop: MutableProperty<Dah, Dah>
init() {
prop = MutableProperty<Dah, Dah>(Dah())
doSomethingWith(prop)
}
}
因此,似乎有几个基本问题。
给定某个ReactiveCocoa
对象。。。
- 我应该在什么时候将声明为属性(
let
或var
)与本地实例变量 - 我应该在什么时候将实例化为存储的、计算的或属性与实例的其他变体
- 什么时候应该是函数
return
MutableProperty
是一个class
。换句话说:它具有引用语义。与Signal
(其生存期取决于终止事件)不同,property
的生存期由所有者定义。如果没有对象持有对某个属性的引用,则会将其释放。
因此,您的问题的答案通常是将其存储在另一个类中。
一个常见的做法是保留MutableProperty
private
,只暴露一个可读的:
final class Owner {
private let mutableProperty = MutableProperty<Type?>(nil)
public var property: AnyProperty<Type?> {
return AnyProperty(self.mutableProperty)
}
}