我只是想知道在 Swift 中声明属性的“标准”方式是什么。特别是,似乎所有 Apple 的 Swift 示例代码都没有封装属性(您可以自由获取和设置属性,而无需通过 getter 和 setter 方法)。 (我习惯了 Java,所以我很难相信这就是 Apple 期望开发人员编写代码的方式。)
现在,我有:
private var x: Int
private var xListener: XListener?
public func getX() -> Int {
return x
}
public func setX(newValue: Int) {
x = newValue
if (let listener = xListener) {
listener.onXSet(x)
}
}
但我觉得必须有一种更简单的方法来做到这一点。我看到一些关于计算属性的提及,但似乎这些属性不存储值,因此要使用它们,您必须执行以下操作:
private storedX: Int
public var x: Int {
get {
return storedX
}
set {
storedX = newValue
}
didSet {
if (let listener = xListener) {
listener.onXSet(storedX)
}
}
}
我只是很难相信这两种方法都是“正确”的方法,因为它们太复杂了。 Swift 通常不会封装属性,还是我只是遗漏了一些东西?
最佳答案
与仅使用属性相比,不执行任何操作的 setter 和 getter 根本不提供任何封装。这之间实际上没有语义差异:
private storedX: Int
public var x: Int {
get {
return storedX
}
set {
storedX = newValue
}
}
还有这个
public var x: Int
您可以随时返回并更改(尽管有限制,除非您启用了库进化,否则您必须重新编译所有链接的代码)x稍后成为计算属性,或添加didSet/willSet等...
您能否更详细地解释一下,您希望通过使用 setter 和 getter 封装 x 来获得什么,这些 setter 和 getter 的功能与直接设置和获取它的功能相同?
(编辑:要直接回答问题,我会这样做:
public var x : Int {
didSet {
xListener?.onXSet(storedX)
}
}
)
关于Swift 属性封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34822637/