【问题标题】:Swift - Custom setter on propertySwift - 属性的自定义设置器
【发布时间】:2014-09-13 23:13:48
【问题描述】:

我正在将一个项目转换为 Swift 代码,但在 setter 中遇到了问题。我的 Objective-C 代码如下所示:

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

        [self useDocument];
    }
}

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

我找到了属性观察器willSetdidSet,但它们只在属性更新时工作,而不是在初始化和更新时。

有什么想法吗?谢谢

更新

在尝试 get{} 和 set{} 后,我收到了 EXC_BAD_ACCESS 错误

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

        useDocument()
    }
}

【问题讨论】:

标签: swift setter


【解决方案1】:

你不能像那样使用set,因为当你调用self.document = newValue时,你只是再次调用了setter;你已经创建了一个无限循环。

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

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

【讨论】:

  • 如果结果是无限循环,我不明白为什么编译器会明确要求将 self 添加到 setter 中。我是这里唯一认为使用私有 var 不是一个优雅的解决方案的人? getter 和 setter 函数会做得更好
  • Swift 正在进行中。像这样的小事还有很多,希望苹果让编译器自动为你做这些脏活,这样你就可以专心写代码,而不是一直像“arrrrgh”一样
  • 到目前为止 swift 3 有什么更新吗?还是投了赞成票。
  • 这绝对缺乏一些魔力。 Kotlin 有 field 支持字段来处理自定义 getter 和 setter。
【解决方案2】:

这是一个 Swift 3 版本

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 2013-01-25
    • 2012-12-17
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多