Swift 属性封装

标签 swift

我只是想知道在 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/

相关文章:

ios - 如果在 PayPalPaymentViewController [Paypal iOS SDK] 中选择 PaywithCard,应用程序会崩溃

ios - 在远程通知上安排本地通知

ios - .reloadData() 没有重新创建可见单元格或内存中的单元格?

ios - INVoiceShortcutCenter.shared.setShortcutSuggestions(suggestions) 在 iOS 13 Beta 中崩溃。 Xcode 11 测试版

Swift 计时器检查 TouchesEnded

swift - 我基于 swift 的 Mac OS 应用程序在其他机器上启动时崩溃

iOS - 显示来自 tableView didSelect 的信息

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

iOS SWRevealViewController 如何以编程方式隐藏左侧部分

objective-c - 如何在 Swift 中打印此方法的最终结果?