swift - 使用“公开”和“公开”

我已经阅读了关于新修饰符“open”和“fileprivate”的文档。但有两件事我不明白:
为什么不能将协议或扩展也声明为“open”?这是否意味着不能在模块外使用这些东西?
如果我不想为一个模块构建类,而是为一个公共应用程序构建类,那么我应该声明我的类和方法为“open”还是只让它们“public”是一个好的做法?

最佳答案

正如this answer所说:
开放类在定义模块之外是可访问的和可子类的。开放类成员可以在定义模块外部访问和重写。
公共类是可访问的,但不能在定义模块之外进行子类化。公共类成员可以访问,但不能在定义模块外部重写。
我想你的第一个问题的答案是,你不能重写或子类化一个协议或扩展。因此,这样的东西open是没有用的,因为public已经使它们可以在模块外部访问。
对于第二个问题,我想说的是,如果您计划重写或子类化,那么您应该将自己的类声明为open。否则,您将允许对这些项目进行不必要的访问。大多数时候public应该适合你的需要。
编辑:
正如@Alex指出的,我认为允许这种“额外访问”并没有太多的缺点。我唯一能想到的是,如果你只是想保护你的班级不受未来的影响,但这可能适用,也可能不适用。因此,如果不是这样,那么在默认情况下将它们设置为open不会有太大的危害。

本文翻译自 https://stackoverflow.com/questions/41658358/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 swift swift3 modifiers


相关文章:

ios - 如果将滤镜应用于高度>宽度的PNG,则会将图像旋转90度。如何有效防止这种情况?

c++ - 为什么静态修饰符阻止其变量重新分配新值?

ruby - 尝试在watir-webdriver / selenium-webdriver脚本中按CTRL +单击或SHIFT +单击时出现“ TypeError:无法将字符串转换为整数”

swift - 在初始化所有存储属性之前使用'self'

ios - 使用Google Direction API绘制路径

swift - Swift Regex优化

ios - 使用刷新器时,集合视图索引超出范围

java - Java常数和静态修饰符

ios - 如果我执行放宽顺序(显示),则母亲视图控制器如何获得孩子的视图控制器?

swift - UILabel在Swift 2中抛出线程1:EXC_BAD_ACCESS(代码= 1,地址0x…)