使用 "open" 和 "public"

Using of "open" and "public"

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

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

正如所说:

  • 一个开放的 class 是可以访问的,并且可以在定义模块之外进行子class。开放的 class 成员可以在定义模块之外访问和覆盖。
  • A public class 可以访问,但不能在定义模块之外访问class。 public class 成员可访问,但在定义模块之外不可覆盖。

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

对于你的第二个问题,我会说你应该只声明你自己的 classes 为 open 如果你计划覆盖或 subclassing。否则,您将允许对这些项目进行不必要的访问。大多数时候 public 应该适合您的需要。

编辑:

正如@Alex 指出的那样,我不认为允许这个 "extra access" 有很多缺点。我唯一能想到的是,如果你只是想保护你的 classes 免受未来的自己的伤害,但这可能适用也可能不适用。因此,如果不是这种情况,默认情况下将它们设置为 open 应该不会有太大危害。

open是给另一个模块用的,比如我们在单元测试或者cocoapods中使用它,你可以从 pod 继承(如果是:open class somePod {...})或 override 一些函数(如果是:open func someFunctionInPod{.. .}) 在你的项目中。