【问题标题】:The use of private keyword in Swift and their use in protocols?Swift 中私有关键字的使用及其在协议中的使用?
【发布时间】:2015-10-10 09:39:23
【问题描述】:

我正在构建一个 iOS 应用程序,我想在其中为我的模型创建一个协议(据我了解,这相当于 java 接口),用于单元测试目的。

在 Java 中,您通常希望将值封装在模型中,并使其只能通过 getter 和 setter 访问。

我如何确保在 Swift 中使用协议进行这种封装,而我不能对属性使用 private 关键字。

我的模型设置如下:

class model { 
    private var property: Int = 5

    func getProperty() -> Int {
        return property
    }

    func setProperty(newValue: Int) {
        self.property = newValue
    }
}

我希望我的协议看起来像这样:

protocol modelProtocol { 

    private var property: Int { get set }
}

我的问题是我不能将我的属性声明为私有,这只是 Swifts 访问控制中的一件事(我已经读过它们有私有、内部和公共),你没有那么多使用私有属性或者是有没有类似 Java 处理接口和私有变量的方式?

(注意:如果重要的话,我使用的是 Xcode 7 和 swift 2.0)

【问题讨论】:

    标签: ios swift model protocols


    【解决方案1】:

    我不认为您可以使用 Swift 代码拥有私有属性和公共 Getter 和 Setter,因为 getter 和 setter 不能拥有比属性更高的访问控制。出于单元测试的目的,您可以使用@testable 属性访问任何内部实体,如下面的文档所示。

    单元测试目标的访问级别

    当您编写具有单元测试目标的应用时,您的应用中的代码需要可供该模块使用才能进行测试。默认情况下,其他模块只能访问标记为公共的实体。但是,如果您使用 @testable 属性标记产品模块的导入声明并在启用测试的情况下编译该产品模块,则单元测试目标可以访问任何内部实体。

    我认为您不能在协议中声明私有属性,您可能需要使用基类而不是内部属性并扩展该类。我本人对协议还很陌生,但我相信它们主要用于确保代码符合该协议,例如......它提供了该功能或那些方法。

    参考文献:

    Swift Access Control

    Swift Properties

    Swift unit testing access

    【讨论】:

    • 感谢您的解释 - 非常好和描述性 +1! :) 但是从我的 Java 子类化经验来看,我的情况是“不,不”,因为我想使用策略模式以不同的方式修改我的模型进行测试,所以我想要一个协议,但也封装了属性,但在 Swift 中似乎不是那么容易甚至是不可能的。 悲伤的脸
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 2018-05-23
    • 2015-11-18
    • 2015-03-12
    • 1970-01-01
    • 2014-12-15
    • 2021-12-31
    • 2022-01-09
    相关资源
    最近更新 更多