Swift进阶11:访问控制

访问控制限制其他源文件和模块对你的代码的访问。这个特性允许你隐藏代码的实现细节,并指定一个偏好的接口让其他代码可以访问和使用。

模块和源文件

Swift 的访问控制模型基于模块和源文件的概念。

  • 模块是单一的代码分配单元——一个框架或应用程序会作为的独立的单元构建和发布并且可以使用 Swift 的 import 关键字导入到另一个模块。
  • 源文件是一个模块中的单个 Swift 源代码文件(实际上,是一个应用程序或是框架中的单个文件)。虽然通常在单独源文件中定义单个类型,但是一个源文件可以包含多个类型。函数等的定义。

访问级别

Swift 为代码的实体提供个五个不同的访问级别。这些访问级别和定义实体的源文件相关,并且也和源文件所属的模块相关。

  • private:访问级别仅在当前定义的作用域内有效(单例中使用过)
//private:访问级别`仅在当前定义的作用域内有效
class HTTeacher{
    static let shareInstance = HTTeacher()
    private init(){}
}
var t = HTTeacher.shareInstance
  • filePrivate:访问限制仅限制在当前定义的源文件中
  • Internal:默认访问级别,允许实体被定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问。通常在定义应用程序或是框架的内部结构时使用。(例如 import Foundation,其中Foundation就是一个模块)
  • public:开放式访问,允许实体被定义模块中的任意源文件访问,同样可以被另一模块的源文件通过导入该定义模块来访问。但是只能在定义的模块中继承和子类重写
  • open:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写

public与open的区别

  • public 访问,或任何更严格的访问级别的类,只能在其定义模块中被继承
  • public 访问,或任何更严格访问级别的类成员,只能被其定义模块的子类重写
  • open 类可以在其定义模块中被继承,也可在任何导入定义模块的其他模块中被继承。
  • open 类成员可以被其定义模块的子类重写,也可以被导入其定义模块的任何模块重写。

访问级别的指导准则

Swift 中的访问级别遵循一个总体指导准则:实体不可以被更低(限制更多)访问级别的实体定义

  • 一个 public 的变量其类型的访问级别不能是 internal, file-private 或是 private,因为在使用 public 变量的地方可能没有这些类型的访问权限。
  • 一个函数不能比它的参数类型和返回类型访问级别高,因为函数可以使用的环境而其参数和返回类型却不能使用。

总结

  • 没有写访问控制权限关键字时,默认的访问权限是internal
  • 访问控制权限从高到低的顺序:open > public > internal > filePrivate > private
    • 1、private:访问级别仅在当前定义的作用域内有效
    • 2、filePrivate:访问限制仅限制在当前定义的源文件中
    • 3、internal:默认访问级别,允许定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问
    • 4、public:开放式访问,使我们能够在其定义模块的任何源文件中使用代码,并且可以从另一个源文件访问源文件。但是只能在定义的模块中继承和子类重写
    • 5、open:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容