概述
Swift 3中,新增了 fileprivate 和 open 权限,而在Swift4 中,对 fileprivate 和 private 的访问范围做出了调整。访问控制限制你在不同源文件和 module 之前代码和代码之前的访问。这个特性让你可以隐藏一些代码的实现,和明确一些可以访问和使用的接口。
Modules 和 源文件
Swift 的访问控制模型是基于 module 和 源文件的。
一个 module 是一个独立的代码建造单元,例如一个 framework 或者 application 可以构建和包装成一个可以被其他 module 通过 Swift 的关键字 import 的单元。
一个源文件是在一个 module 里单独的 Swift 源码(或在 一个 app 或 framework 里的单独的文件) 。虽然常见的是在分开的源文件里定义单独的类型,但一个单独的源文件也能包含多个类型,方法等的定义。
访问级别
Swift 提供5个不同的访问级别,权限最高的是open
,依次是 public
,internal
,fileprivate
,最低的是private
。默认使用的级别是 internal
。
open & public
使用 open 和 public 标记的实体在他们定义的 module 中的任意文件中都可以使用,并且在 import 了其定义的 module 的其他 module 的源文件中也能使用。一般在 framework 中指定公开的接口里使用 open 或者 public 级别。
open 和 public 的区别
- 拥有 public 权限或者更低权限的类,只能在其定义的 module 中被子类化
- 拥有 public 权限或者更低权限的类的成员,只能在其定义的 module 中被重写或子类化
- 拥有open 权限的类可以在其定义和 import 的 module 中子类化
- 拥有open 权限的类成员可以在其定义和 import 的 module 中被重写或子类化
internal
internal 修饰的实体在其定义 module 中的任意源文件中都可以访问,但是在其他 module 的任意源文件中都访问不了。一般在定义app 或者 framework 内部的结构的时候,使用 internal 级别。
fileprivate
fileprivate 限制了只能在其定义的源文件里面使用。使用 fileprivate 权限以隐藏其实现细节。当其只在整个源文件中使用的时候,使用 fileprivate 修饰。
private
private 访问权限限制其只能在定义的范围内,和其在同一文件中的 extension 中使用。当其只在当个声明中使用的时候,使用 private 修饰。
使用原则
子类: 子类的访问级别不能高于父类,但是子类复写的父类方法的访问级别可以高于父类
枚举: 枚举的每个值都和他们所属的枚举拥有相同的级别,并且并不能定义单独的访问级别。
协议: 你可以给协议指定访问级别,并且对于协议的每一项来说,访问级别都和协议相同。并且你不能单独给协议中单独的方法等定义不同的访问级别。