Swift属性 - getter ivar

时间:2014-09-14 00:22:38

标签: swift getter

我们应该在Swift吸气剂中使用ivar属性吗?我的代码导致getter调用getter,直到程序崩溃:

var document: UIDocument? {
    get {
        return self.document
    }
    set {
        self.document = newValue

        useDocument()
    }
}

3 个答案:

答案 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()
    }
}