使用“开放”和“公开”

alt*_*ser 3 modifiers swift swift3

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

  1. 为什么不能将协议或扩展声明为“开放”?这是否意味着不可能在模块之外使用这些东西?
  2. 如果我不想为模块构建类,而是为通用应用程序构建类,那么我是否应该将我的类和方法声明为“开放”,或者仅将它们保留为“公共”是一个好习惯吗?

Ben*_*wry 6

正如这个答案所说:

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

我认为你的第一个问题的答案是你不能覆盖或子类协议或扩展。因此,这些东西是没有用的,open因为public它们已经可以在模块外部访问了。

对于你的第二个问题,我想说你应该只声明你自己的类,就像open你计划覆盖或子类化一样。否则,您将允许对这些项目进行不必要的访问。大多数时候public应该适合您的需要。

编辑

正如@Alex 指出的那样,我认为允许这种“额外访问”没有太多缺点。我唯一能想到的是,如果你只是想保护你的班级免受未来的自己的影响,但这可能适用也可能不适用。因此,如果情况并非如此,将它们设置为open默认值应该不会有太大危害。