我正在构建一个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,如果重要的话)
答案 0 :(得分:1)
我不认为您可以使用Swift代码拥有私有属性和公共Getter和Setter,因为getter和setter不能拥有更高访问控制而不是属性。对于单元测试目的,您可以使用@testable属性访问任何内部实体,如下面的文档所示。
单元测试目标的访问级别
当您使用单元测试目标编写应用程序时,您的应用程序中的代码需要可供该模块使用才能进行测试。默认情况下,只有标记为public的实体才可供其他模块访问。但是,如果使用@testable属性标记产品模块的import声明并且在启用测试的情况下编译该产品模块,则单元测试目标可以访问任何内部实体。
我认为您无法在协议中声明私有属性,您可能需要使用基类而不是内部属性并扩展该类。我自己对协议仍然相当新,但我相信它们主要用于确保代码符合该协议,因为...它提供了该功能或那些方法。
使用的参考文献: