主要介绍swift中的访问控制权限关键字
private
1、private:访问级别仅在当前定义的作用域内有效(单例中使用过)
//8-1、private:访问级别`仅在当前定义的作用域内有效 class CJLTeacher{ static let shareInstance = CJLTeacher() private init(){} } var t = CJLTeacher.shareInstance
filePrivate
filePrivate:访问限制仅限制在当前定义的源文件中
在access.swift文件中定义一个CJLPartTimeTeacher全局变量,系统报错,其主要原因是 pt 默认的权限是 Internal的,而CJLPartTimeTeacher的访问权限是fileprivate的,pt的权限大于CJLPartTimeTeacher,系统不允许这样,所以提示错误
- 需要使用
private / fileprivate修饰pt
private let pt = CJLPartTimeTeacher(10.0) //或者 fileprivate let pt = CJLPartTimeTeacher(10.0)
如果是直接定义在方法中的,可以不用访问权限修饰符
func test(){ let pt = CJLPartTimeTeacher(10.0) }
Internal
Internal:默认访问级别,允许定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问(例如 import Foundation,其中Foundation就是一个模块)
<!--1、main.swift--> import Foundation class CJLTeacher{ init(){} } let t = CJLTeacher() <!--2、custom--> import AppKit //访问main.swift中t,报错:Expressions are not allowed at the top level print(t)
报错的主要原因是t在main.swift文件中的默认权限是Internal,只能在同一个模块内使用,其属于Foundation模块,而custom.swift文件中不能调用t,是因为其属于AppKit模块,与Foundation并不是同一个模块,所以不能访问
public
public:开放式访问,使我们能够在其定义模块的任何源文件中使用代码,并且可以从另一个源文件访问源文件。但是只能在定义的模块中继承和子类重写
open
open:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写
public与open的区别:
- public不可继承
- open可继承
总结:
- 没有写访问控制权限关键字时,
默认的访问权限是internal - 访问控制权限
从高到低的顺序:open > public > internal > filePrivate > private
- 1、
private:访问级别仅在当前定义的作用域内有效 - 2、
filePrivate:访问限制仅限制在当前定义的源文件中 - 3、
Internal:默认访问级别,允许定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问 - 4、
public:开放式访问,使我们能够在其定义模块的任何源文件中使用代码,并且可以从另一个源文件访问源文件。但是只能在定义的模块中继承和子类重写 - 5、
open:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写


