-
访问控制修饰符
- open: 模块完全开放,在别的模块下可以进行继承后重写。
- public: 模块开放,在别的模块下不可以进行继承重写。
- internal: 只能在本模块内部使用。(默认)
- fileprivate: 只能在本文件内部使用。
- private: 只能在定义的作用域内使用。
-
类型的访问权限会影响实体的访问权限
open class a {
var a = 3 // 隐式internal
}
public class b {
var b = 3 //隐式internal
}
class c {
var c = 3 //隐式internal
}
fileprivate class d {
var d = 3 //隐式fileprivate
}
private class e {
var e = 3 //隐式private
}
- 元组类型
- 元组的访问级别是其中访问级别最低的那一个。
- 函数类型
- 函数的最高访问级别是函数的参数类型,或者返回值类型中访问级别最低的。
- 如果默认的函数访问级别不满足那么编译器会报错。
internal class Test {
}
fileprivate class Test1 {
}
//报错
func test0() -> (Test, Test1){
return (Test(), Test1())
}
//正常
fileprivate func test() -> (Test, Test1){
return (Test(), Test1())
}
private func test1() -> (Test, Test1){
return (Test(), Test1())
}
- 枚举类型
枚举类型的成员和枚举类型的访问级别一致
private enum Test {
case One, Two, Three//默认是private类型(和枚举类型的访问级别一致)
}
-
嵌套类型
0. swift5.1新特性- 如果外层函数是open,public,internal,那么默认内层函数是internal级别。
- 如果外层函数是private,那么内层函数是private级别。
-
子类
子类的访问级别不能高于父类
public class A {
fileprivate func test() {
print("A")
}
}
internal class B: A {
override public func test() {
super.test()
print("B")
}
}
var a = B()
a.test()
- 类实例的访问级别
- 如果用一个变量来接收一个类的实例,那么这个变量的访问级别默认是internal,如果比实例的级别高,那么会报错。
- 这个用来接收类实例的变量的访问级别不能高于类的访问级别。
public class A {
fileprivate func test() {
print("A")
}
}
fileprivate class B: A {
override public func test() {
super.test()
print("B")
}
}
var a = A()
private var b = B()
b.test()
- get,set
可以利用访问级别关键字来控制set方法的级别低于get方法,这样可以表现为在内部可读可写,在外部表现为只读.
struct TrackedString {
private(set) var numberOfEdit = 0
var value: String = "" {
didSet{
numberOfEdit += 1
}
}
init() {
}
}
var a = TrackedString()
a.value = "a"
a.value = "b"
a.value = "c"
a.value = "d"
print(a.numberOfEdit)
-
构造器
- 一个无参数的构造器,如果所处的类或者结构体是open,public,internal。那么该构造器的访问级别就是internal。如果是priavate,那么该构造器的访问级别就是internal。
- 如果一个结构体中的成员有一个是private,那么该结构体的默认成员逐一构造器的访问级别就是private。
- 其实和函数的访问级别原则一样。
-
协议
- 如果一个协议被写成public访问级别那么,该协议的遵守者也是public的类型。并且所有实现也都是public类型。也就是说协议的访问级别就是协议内容的访问级别。
- 协议的继承,一个子协议的访问级别最高是父协议的访问级别。
-
扩展
- 扩展的类类型的默认访问级别是和原类一致的。可以自定义也。
- 通过扩展遵守协议,那么协议实现部分应该和协议的定义访问级别一致,不能自定义修改。其他的方法等的访问级别和原类一致,支持自定义修改。
-
泛型
泛型函数的访问级别受函数传入的泛型访问级别影响,还和约束有关系。取其中最低的访问级别。 -
类型别名
类型别名的访问级别最高是原类型的级别。