在Swift中使用private关键字及其在协议中的使用?

时间:2015-10-10 09:39:23

标签: ios swift model protocols

我正在构建一个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,如果重要的话)

1 个答案:

答案 0 :(得分:1)

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

  

单元测试目标的访问级别

     

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

我认为您无法在协议中声明私有属性,您可能需要使用基类而不是内部属性并扩展该类。我自己对协议仍然相当新,但我相信它们主要用于确保代码符合该协议,因为...它提供了该功能或那些方法。

使用的参考文献:

Swift Access Control

Swift Properties

Swift unit testing access