解释Swift的访问控制的图

简短明了,这是总结Swift中访问级别的图表。

如果您有兴趣,请继续阅读下面的详细说明。

访问控制限制从其他源文件和模块中的代码访问部分代码。 使用此功能,您可以隐藏代码的实现细节,并指定可以访问和使用该代码的首选接口。

您可以为单个类型(类,结构和枚举)以及属于这些类型的属性,方法,初始化程序和下标分配特定的访问级别。 协议可以限制在特定的上下文中,全局常量,变量和函数也可以。 可以将访问控制应用于代码的这些各个方面,为了简洁起见,称为“实体”。

Swift 3和Swift 4提供openpublicinternalfileprivateprivate用于访问控制。 开放访问是最高(最低限制)访问级别,而私有访问是最低(最高限制)访问级别。

开放(最高访问级别和最低限制)

开放访问和公共访问使实体可以在其定义模块的任何源文件中使用,也可以在导入定义模块的另一个模块的源文件中使用。 指定框架的公共接口时,通常使用开放访问或公共访问。

请注意,开放式访问权限仅适用于班级班级成员 。 开放类可以在将定义导入到模块的任何模块中被子类化。 开放类成员可以被导入其定义模块的任何模块中的子类覆盖。

让我们以UIViewController为例, UIViewController属于UIKit模块,该模块已导入到当前模块中。 viewDidLoadUIViewController类中定义的方法。

import UIKit 
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}

由于UIViewController是子类的,而viewDidLoad是可重写的,因此我们可以确保在UIKit模块中, UIViewController是一个开放类,而viewDidLoad是一个开放方法。 我们可以通过检查定义来证明这一点。

 open class UIViewController : UIResponder, NSCoding, UIAppearanceContainer, UITraitEnvironment, UIContentContainer, UIFocusEnvironment { 
open func viewDidLoad()
}

上市

与开放访问相同,公共访问还使定义模块中的实体可以在其他模块中使用。 公共访问和开放访问之间的区别在于,公共类不能在任何其他模块内被子类化,并且公共类成员不能被任何其他模块内的子类覆盖。

然后,您将了解Swift引入开放访问的原因。 这是因为Swift希望为程序员提供控制其公共类是否可以在其他模块内被子类化,或者其公共类成员是否可以被其他模块内的子类所覆盖的能力。 简而言之,Swift提供了精细控制模块之间的子类性和重写能力的能力。

让我们看看UIViewController定义中的另一个方法:

 public init?(coder aDecoder: NSCoder) 

如您所见,它是一个公共方法,没有打开,因此只能在我们当前的模块中使用它,但不能覆盖此方法。

内部(默认访问级别)

internal是默认访问级别。 内部实体可以在定义它们的相同模块(目标)内的任何位置进行访问。 在定义应用程序或框架的内部结构时,通常使用internal访问。

请注意,内部类当然可以在定义模块内被子类化,内部类成员当然可以被定义模块内的子类覆盖。

私人文件

文件专用访问将实体的使用限制在其定义的源文件中。 当在整个文件中使用特定功能的实现细节时,通常会使用fileprivate来隐藏它们。

私有(最低访问级别和最严格的限制)

专用访问将实体的使用限制为封闭的声明以及该声明在同一文件中的扩展名。 当仅在单个声明中使用特定功能的实现细节时,通常会使用它们进行private访问。

说到私有访问,Swift3和Swift4之间是有区别的。 在Swift3中,您无法在同一源文件中的类扩展名内访问类的私有实体,而在Swift4中则可以。

 class A { 
private var name
}
 extension A { 
func foo() {
print("my name is \(name)")
}
}

上面的代码在Swift4中有效,但在Swift3中无效,在Swift3中会出现编译错误。 Swift3中的替代选项是使用文件私有访问。

 class A { 
fileprivate var name
}
 extension A { 
func foo() {
print("my name is \(name)")
}
}

好的,这就是Swift的访问控制,欢迎在下面发表评论进行讨论。