>[**swift进阶总汇**](https://www.jianshu.com/p/c00fa675d7d5) 主要介绍swift中的访问控制权限关键字 ![](https://upload-images.jianshu.io/upload_images/25331915-fbd52cc42bea4ea7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## private 1、`private`:访问级别`仅在当前定义的作用域内有效`(单例中使用过) ``` //8-1、private:访问级别`仅在当前定义的作用域内有效 class CJLTeacher{ static let shareInstance = CJLTeacher() private init(){} } var t = CJLTeacher.shareInstance ``` ## filePrivate `filePrivate`:访问限制`仅限制在当前定义的源文件中` ``` fileprivate class CJLPartTimeTeacher: CJLTeacher{ var partTime: Double? init(_ partTime: Double) { super.init() self.partTime = partTime } } ``` ![](https://upload-images.jianshu.io/upload_images/25331915-a34aa273b3868aba?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 调用报错提示 在access.swift文件中定义一个`CJLPartTimeTeacher`全局变量,系统报错,其主要原因是 pt 默认的权限是 Internal的,而`CJLPartTimeTeacher`的访问权限是`fileprivate`的,pt的权限大于`CJLPartTimeTeacher`,系统不允许这样,所以提示错误 ![](https://upload-images.jianshu.io/upload_images/25331915-2d873c5ac5b4ca34?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) filePrivate报错提示 * 需要使用`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就是一个模块) ``` import Foundation class CJLTeacher{ init(){} } let t = CJLTeacher() import AppKit //访问main.swift中t,报错:Expressions are not allowed at the top level print(t) ``` ![](https://upload-images.jianshu.io/upload_images/25331915-aaa539fa8d42b128?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) Internal报错提示 报错的主要原因是`t`在`main.swift`文件中的默认权限是`Internal`,只能在同一个模块内使用,其属于`Foundation`模块,而`custom.swift`文件中不能调用t,是因为其属于`AppKit`模块,与`Foundation`并不是同一个模块,所以不能访问 ## public `public`:开放式访问,使我们能够在其定义模块的任何源文件中使用代码,并且可以从另一个源文件访问源文件。但是`只能在定义的模块中继承和子类重写` ## open `open`:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写 public与open的区别: * public不可继承 * open可继承 ## 总结: >作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:[130 595 548](https://jq.qq.com/?_wv=1027&k=L3kztZno),不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!) * 没有写访问控制权限关键字时,`默认`的`访问权限是internal` * 访问控制权限`从高到低`的顺序:`open > public > internal > filePrivate > private` * 1、`private`:访问级别`仅在当前定义的作用域内有效` * 2、`filePrivate`:访问限制`仅限制在当前定义的源文件中` * 3、`Internal`:默认访问级别,允许定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问 * 4、`public`:开放式访问,使我们能够在其定义模块的任何源文件中使用代码,并且可以从另一个源文件访问源文件。但是`只能在定义的模块中继承和子类重写` * 5、`open`:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写