访问级别
Swift 中提供了以下五种不同的访问级别。
权限级别 | 描述 |
---|---|
public/open | 以访问同一模块源文件中的任何实体,在模块外也可以通过导入该模块来访问源文件 里的所有实体 |
internal | 默认级别,可以访问同一模块源文件中的任何实体 |
fileprivate | 限制实体只能被所定义的文件内部访问 |
private | 限制实体只能在所定义的作用域内使用 |
访问控制语法
public class MyPublicClass {}
internal class MyInternalClass {}
fileprivate class MyFilePrivateClass {}
private class MyPrivateClass {}
public /* let */ var MyPublicVariable = 0
internal /* let */ var MyInternalVariable = 0
fileprivate /* let */ var MyFilePrivateVariable = 0
private /* let */ var MyPrivateVariable = 0
public func MyPublicFunction() {}
internal func MyInternalFunction() {}
fileprivate func MyFilePrivateFunction() {}
private func MyPrivateFunction() {}
访问基本原则
Swift 中的访问级别遵循一个基本原则:不可以在某个实体中定义访问级别更高的实体。
e.g.
fileprivate class MyClass {
public let num0 = 0;
/* internal */ let num1 = 10;
fileprivate let num2 = 20;
private let num3 = 30;
}
- 在上面的代码中,定义了一个 fileprivate 权限的 MyClass 类,而在 MyClass 内部不可以定义访问权限更高(public、internal)的实体(变量、常量、方法、类型等)。
- 在实际开中即使违法了此原则,Xcode不会发出警告或者编译错误(我猜Xcode会自动修正访问权限)
自定义类型
一个类型的访问级别也会影响到类型成员(属性、方法、构造器、下标)的默认访问级别。
e.g.
fileprivate class MyModel {
var name: String?
var age: Int?
}
在上面的代码中,定义了一个 fileprivate 权限的 MyModel 模型,而 MyModel 内部的 name和age 并没有显式指定访问级别,但不是默认访问级别(internal), 而是 fileprivate 访问级别。
还不快抢沙发