1

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

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

2 回答 2

3

正如这个答案所说:

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

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

对于你的第二个问题,我想说你应该只声明你自己的类,就open好像你打算覆盖或继承一样。否则,您将允许对这些项目进行不必要的访问。大多数时候public应该满足您的需求。

编辑

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

于 2017-01-15T06:20:46.323 回答
1

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

于 2018-12-18T23:52:10.033 回答