私人vs FilePrivate

今天,我想讨论一个我多次见过但从未理解过的用法和概念的主题。 我所指的主题是私有和文件私有。 为了理解这两个主题的功能,首先我必须讨论访问控制的5个级别。 大! 让我们深入了解😎。

5级访问控制

世界上什么是访问控制? 访问控制是一项功能,可以确定源文件和模块的限制。 您可以为单个类型(类,结构和枚举)以及属性,方法,初始化程序和下标分配特定的访问级别。 有5种不同级别的访问控制,如下所示:

  • 开放存取
  • 公共访问
  • 内部访问
  • 文件专用访问
  • 私人通道

开放访问和公共访问授予其实体在模块内所有源文件和其他模块中源文件中使用的权限。 这两个访问控制的行为非常相似,但开放访问的限制最少。 可以在所有模块和导入的模块之间子类化开放访问类。 此外,开放式访问子类可以在其自己的模块和任何导入的模块中覆盖。 通常,当您开发框架时,开放式访问将应用于API。 尽管您的界面可能是公共的,但是您可以将代码中的详细信息设置为内部,私有或文件私有。

内部访问授予其实体仅在其模块内使用的权限。 内部访问类也可以被其子类覆盖。 创建任何项目时,都必须具有访问级别。 默认情况下,内部访问被授予,因此无需明确声明访问级别。 在大多数情况下,编写单元测试时,其访问级别必须是内部的。 这很有意义,因为您只希望测试在自己的模块上执行。

在Swift 3到来之前,只有私人通道。 专用访问限制了它在声明它的源文件中的使用。 如果要创建私有类,则无法在另一个文件中访问其属性。 但是,我可以创建一个子类来覆盖超类的属性以进行访问。 我还可以使用私有访问权限来创建班级的扩展。 Swift 3到来之后,访问控制发生了一些变化。 更改之一是文件专用访问现在已替换了专用访问。 那么私人访问有什么用呢? 私有访问增加了另一层限制。 现在只能在其自己的声明(大括号内)中使用私有访问。 那为什么要改变呢? 据我所知,如果我们可以通过其他方法访问私有属性,那么私有是非常误导的,那么它真的是私有的吗? 苹果需要区别对待,因此创建了文件专用 ,而私有现在是真正的私有。

我要注意的几件事是,子类不能具有比其父类更高的访问级别(例如:您不能使用私有父类编写内部子类。这同样适用于常量,变量,属性和下标。元组必须具有相同的类型和相同的访问级别,其中一种类型的访问级别不能高于或低于另一种类型,但是对于setter和getter而言,允许setter的访问级别低于其getter。我想提及的是final关键字,由于我的好奇心和困惑,我想提及这一点。final不是访问级别,但是在任何访问级别上使用它,都可以防止子类化和覆盖。