使用"打开"和#34;公共"

时间:2017-01-15 06:11:58

标签: swift swift3 modifiers

我已经阅读了有关新修饰符的文档" open"和" fileprivate"。但有两件事我不明白:

  1. 为什么不能将协议或扩展声明为" open"?它是否意味着在模块外部不能使用这些东西?
  2. 如果我不想为一个模块而不是一个普通的应用程序构建我的类,我应该将我的类和方法声明为" open"无论如何还是仅仅保留它们的良好做法" public"?

2 个答案:

答案 0 :(得分:1)

正如this answer所说:

  • 开放类可以在定义模块之外访问和子类化。开放类成员可在定义模块外部访问和覆盖。
  • 公共类是可访问的,但不能在定义模块之外进行子类化。公共类成员是可访问的,但在定义模块之外不可覆盖。

我认为您的第一个问题的答案是,您无法覆盖或子类化协议或扩展。因此,open这样的事情是没有用的,因为public已经使它们可以在模块之外访问。

对于你的第二个问题,我会说如果你计划覆盖或继承,你应该只将你自己的类声明为open。否则,您允许不必要地访问这些项目。大部分时间public应该符合您的需求。

修改

正如@Alex指出的那样,我不认为允许这种"额外访问"有许多缺点。我唯一能想到的就是你只是想保护你的课程免受你未来的影响,但这可能适用也可能不适用。因此,如果情况并非如此,默认情况下将它们设置为open并不会造成太大的伤害。

答案 1 :(得分:0)

打开用于另一个模块,例如,在我们在单元测试或可可豆荚中使用它时,您可以继承(如果它是:open class somePod {...})或覆盖项目中的某些功能(如果有的话:打开func someFunctionInPod {...})。