【问题标题】: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 翻译这个成语的最佳方式是什么?
【问题讨论】:
标签:
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 所做的类似。但是你也应该问问自己你是否真的需要这个。在大多数情况下,您不会。