访问权限¶
open:允许在任意的地方访问。公开权限,最高的权限,可以被其他模块访问,继承及复写。只能用于类和类的成员。
在 Swift 中,public
和 open
访问级别都可以被其他模块访问,但只有 open
级别允许类在模块外被继承和重写。
public:公有访问权限。类或者类的公有属性或者公有方法可以从文件或者模块的任何地方进行访问。一个App、一个第三方API、第三方框架等都是一个完整的模块。这些模块如果要对外留有访问的属性或者方法,就应该使用 public 的访问权限。public放在func前面。
internal:internal 是内部的意思,internal 访问权限的属性和方法说明在模块内部可以访问,超出模块内部就不可被访问了。在 Swift 中默认就是 internal 的访问权限。
fliePrivate:只能在定义的源文件访问。文件私有访问权限,被 fileprivate 修饰的类、属性、方法可以在同一个物理文件中访问。
private:只能在定义的类内部使用,私有访问权限。
- 如果一个类的访问级别是 fileprivate 或 private 那么该类的所有成员都是 fileprivate 或 private(此时成员无法修改访问级别)。
- 如果一个类的访问级别是 open、internal 或者public 那么它的所有成员都是internal。
- 类成员的访问级别不能高于类的访问级别(注意:嵌套类型的访问级别也符合此条规则)。
- 常量、变量、属性、下标脚本访问级别低于其所声明的类型级别,并且如果不是默认访问级别(internal)要明确声明访问级别(例如一个常量是一个 private 类型的类类型,那么此常量必须声明为 private 或fileprivate)。
- setter 的访问级别可以低于 getter 的访问级别(例如一个属性访问级别是 internal,那么可以添加 private(set)修饰将 setter 权限设置为 private,在当前模块中只有此源文件可以访问,对外部是只读的)。
- 必要构造方法(required 修饰)的访问级别必须和类访问级别相同,结构体的默认逐一构造函数的访问级别不高于其成员的访问级别(例如一个成员是 private 那么这个构造函数就是private,但是可以通过自定义来声明一个 public 的构造函数),其他方法(包括其他构造方法和普通方法)的访问级别遵循上面规则。
// MARK: private
class LGPersonCS{
private var sex: Bool
private func unpdateSex(){
self.sex = !self.sex
}
init(sex innerSex: Bool) {
self.sex = innerSex
}
func test(){
self.unpdateSex()
}
}
func testP() {
let p = LGPersonCS(sex: true)
p.test()
}