我们应该在Swift吸气剂中使用ivar属性吗?我的代码导致getter调用getter,直到程序崩溃:
var document: UIDocument? {
get {
return self.document
}
set {
self.document = newValue
useDocument()
}
}
答案 0 :(得分:19)
Swift属性不像Objective-C那样具有单独的底层存储的概念。相反,您需要创建第二个(私有)属性并将其用作存储:
private var _document: UIDocument?
var document: UIDocument? {
get {
return _document
}
set {
_document = newValue
useDocument()
}
}
如果您尝试做的只是在设置useDocument()
属性后调用document
,则可以省略getter,setter和private属性,而只使用{{1} }或willSet
。
答案 1 :(得分:8)
如果您要实现的是在设置属性时添加一些自定义处理,则无需定义单独的后备数据成员并实现计算属性:您可以使用willSet
和{ {1}} 属性观察者,分别在之前和 之后分别自动调用。
在您的具体情况下,您应该如何实施您的财产:
didSet
建议阅读:Property Observers
答案 2 :(得分:4)
在你的代码中有一个无限的递归情况:例如,getter中的self.document
一直在调用getter本身。
您需要自己明确定义一个ivar。这是一个可能的解决方案:
private var _document:UIDocument?
var document: UIDocument? {
get {
return self._document
}
set {
self._document = newValue
useDocument()
}
}