注意
为了简单起见,对于代码中可以设置访问级别
的特性(属性、基本类型、函数等),在下面的内容中我们会称之为“实体”
模块
和源文件
这两个概念。内容 | 说明 |
---|---|
Open | 只能作用于类和类的成员,可以被任何人使用,包括重写和继承 |
Public | 可以被任何人使用。但其他模块中不可以被重写和继承,而在本模块内可以被重写和继承 |
Internal(默认访问级别,修饰符可写可不写) | 所修饰的属性或方法在源代码所在的整个模块都可以访问。如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。如果是App代码,也是在整个App代码,也是在整个App内部可以访问 |
File-private | 所修饰的属性或者方法在当前的源文件里可以访问 |
Private | 访问级别所修饰的属性或者方法只能在当前类里访问 |
Open 为最高访问级别(限制最少),Private 为最低访问级别(限制最多)。
public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
fileprivate class SomeFilePrivateClass {
func someFilePrivateMethod() {}
func somePrivateMethod() {}
}
public class SomePublicClass { // 显式 public 类
public var somePublicProperty = 0 // 显式 public 类成员
var someInternalProperty = 0 // 隐式 internal 类成员
fileprivate func someFilePrivateMethod() {} // 显式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
class SomeInternalClass { // 隐式 internal 类
var someInternalProperty = 0 // 隐式 internal 类成员
fileprivate func someFilePrivateMethod() {} // 显式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
fileprivate class SomeFilePrivateClass { // 显式 fileprivate 类
func someFilePrivateMethod() {} // 隐式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
private class SomePrivateClass { // 显式 private 类
func somePrivateMethod() {} // 隐式 private 类成员
}
public class ClassA{
fileprivate func run(){
}
}
internal class ClassB:ClassA{
override internal func run(){
super.run()
}
}
-自定义构造器的访问级别可以低于或等于其所属类的访问级别。唯一的例外是必要构造器,它的访问级别必须和所属类型的访问级别相同
泛型类型或泛型函数的访问级别取决于泛型类型或泛型函数本身的访问级别,还需结合类型参数的类型约束的访问级别,根据这些访问级别中的最低访问级别来确定