Swift系列13-访问控制

访问控制

模块和源文件

Swift的访问控制模型基于模块和源文件的概念.
模块:如UIKit就是一个模块,你也可以自己定义自己的模块(静态库)
源文件:就是一个后缀为.swift的文件.

五个分级别访问控制

open 最高级别,修饰的类和成员允许被其他模块访问,继承和重写

1
2
3
4
5
6
7
8
9
open class K1:NSObject{
open var a1 = "public修饰的属性"
open func abc(){
print("public修饰的方法")
}
public override init() {
super.init()
}
}

public 修饰的类和成员可以被访问但不允许被其他模块继承和重写

1
2
3
4
5
6
7
8
9
public class K1:NSObject{
public var a1 = "属性"
public func abc(){
print("方法")
}
public override init() {
super.init()
}
}

internal 默认级别,可以被模块内任意文件访问,但是不能被模块之外的文件访问

1
2
3
4
5
6
7
8
9
class K1:NSObject{
internal var a1 = "属性"
func abc(){ //不书写时,默认是internal
print("方法")
}
override init() {
super.init()
}
}

fileprivate 只允许当前文件访问,当前文件定义多个类,结构体等都可以访问

1
2
3
4
5
6
7
8
9
fileprivate class K1:NSObject{
fileprivate var a1 = "属性"
fileprivate func abc(){
print("方法")
}
fileprivate override init() {
super.init()
}
}

private 只允许当前类使用

1
2
3
4
5
6
7
8
9
private class K1:NSObject{
private var a1 = "属性"
private func abc(){
print("方法")
}
private override init() {
super.init()
}
}

元组的访问控制

元组类型的访问级别是所有类型里最严格的.例如,如果你将两个不同类型的元素组成一个元组,一个元素的访问级别是internal,另一个是private,那么这个元组类型是private 级别的.

枚举类型

1
2
3
4
5
6
7
//所有成员都是public
public enum CompassPoint {
case north
case south
case east
case west
}

其他

继承子类的访问控制不能比父类的访问控制级别高.如父类是internal,那么子类就不能是public,协议的继承也是如此.
扩展的访问控制和被扩展的类,结构体,枚举保持一致.
泛指类型和泛指函数的访问级别取泛指类型或函数以及泛型类型参数的访问级别的最小值.

The End