Swift - 属性上的自定义setter

时间:2014-09-13 23:13:48

标签: swift setter

我正在将项目转换为Swift代码,并在setter中遇到了一个问题。我的Objective-C代码看起来像这样:

- (void)setDocument:(MyDocument *)document
{
    if (![_document isEqual:document]) {
        _document = document;

        [self useDocument];
    }
}

并允许我的View Controller在每次设置文档时运行它(通常在呈现视图控制器的prepareForSegue:方法中)。

我找到了属性观察者willSetdidSet,但它们仅在更新属性时才起作用,而不是在初始化和更新时。

有什么想法吗?感谢

更新

尝试获取{}并设置{}后,我收到EXC_BAD_ACCESS错误

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

        useDocument()
    }
}

2 个答案:

答案 0 :(得分:47)

你不能那样使用set,因为当你致电self.document = newValue时,你只是再次呼叫二传手;你已经创造了一个无限循环。

您需要做的是创建一个单独的属性来实际存储值:

private var _document: UIDocument? = nil
var document: UIDocument? {
    get {
        return self._document
    }
    set {
        self._document = newValue
        useDocument()
    }
}

答案 1 :(得分:8)

这是一个Swift 3版本

var document : UIDocument? {
    didSet {
        useDocument()
    }
}