Swift - 属性上的自定义setter

Ada*_*ter 22 setter swift

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

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

        [self useDocument];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?谢谢

UPDATE

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

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

        useDocument()
    }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*e S 47

你不能这样使用set,因为当你打电话给self.document = newValue你时,你只是再次打电话给二传手; 你创造了一个无限循环.

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

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

  • [`didSet`](http://stackoverflow.com/a/24334029/187663)似乎更合适. (27认同)
  • 我不明白为什么如果结果是无限循环,编译器会明确要求将self添加到setter中.我是唯一一个认为使用私有var不是优雅解决方案的人吗?getter和setter函数可以做得更好 (17认同)
  • 斯威夫特是一项正在进行的工作.有很多这样的小东西,我希望Apple让编译器自动为你做脏工作,这样你就可以专注于编码而不是像"arrrrgh"那样 (3认同)
  • 这里绝对缺乏一些魔力。Kotlin 有“field”支持字段来处理自定义 getter 和 setter。 (2认同)

Joh*_*hen 8

这是一个Swift 3版本

var document : UIDocument? {
    didSet {
        useDocument()
    }
}
Run Code Online (Sandbox Code Playgroud)