【问题标题】:How do I express this setter pattern in Swift?如何在 Swift 中表达这个 setter 模式?
【发布时间】:2014-11-08 15:39:50
【问题描述】:

我们通常会做喜欢的事情

- (void)setFoo:(Foo *)foo
{
    _foo = foo;

// other computation

}

Getter 和 Setter 警告我不能设置自己的属性。我猜它需要一个计算属性。用 Swift 翻译这个成语的最佳方式是什么?

【问题讨论】:

  • 你能举一个不那么抽象的例子吗?有时你会使用计算属性。有时您只使用属性观察器。这取决于你真正想要做什么。请参阅The Swift Programming Language: PropertiesComputed PropertiesProperty Observers 部分。这个问题不清楚你到底需要什么。

标签: objective-c cocoa swift


【解决方案1】:

如果您正在执行与设置foo 的内部存储紧密集成的计算,特别是如果设置存储取决于此类计算,则@matt 建议的计算属性/存储属性对可能是您需要的解决方案.

否则——如果你需要无条件地响应属性的设置——你正在寻找的是 Swift 的property observers 功能。

var foo: Foo {
willSet(newFoo) {
    // do work that happens before the internal storage changes
    // use 'newFoo' to reference the value to be stored
}
didSet {
     // do work that happens after the internal storage changes
    // use 'oldValue' to reference the value from before the change
}
}

【讨论】:

    【解决方案2】:

    您可以使用存储的私有变量“隐藏”公共计算变量,如下所示:

    private var _foo : Foo!
    var foo : Foo {
        get {
            return _foo
        }
        set (newfoo) {
            _foo = newfoo
        }
    }
    

    这与 Objective-C @synthesize 所做的类似。但是你也应该问问自己你是否真的需要这个。在大多数情况下,您不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      相关资源
      最近更新 更多