Swift 的访问权限控制有一个关键字是 final
,加了 final
后表示这个类就是最终的样子了。有两个作用:
- 不能被 override,因为是最终版了,所以不能被改。
- 优化执行性能。因为所有的方法调用只有一个明确路径(不存在子类),不需要到 vtable 中去查一下。
听起来为了规范,所有的不需要考虑继承的类都应该加上 final
,但是一个项目里这么多类都加上其实也有点累人。很多人不知道的是其实有一些场景不需要自己手动添加。
私有类/属性不用添加
如果你的类的访问属性是 private
或者 fileprivate
,因为只有在当前文件才能被访问,天然就不存在被外部访问继承的可能性,编译器会自动推断添加 final。所以这种情况下不用添加 final
。
默认访问权限(internal)也不用加
如果我们不添加访问权限,默认的访问权限的级别是 internal
,表示只有当前 framework 内可以被访问。如果我们选择的编译模式是Whole Module Optimization (WMO),那么我们也不需要手动添加 final
。
因为 WMO 会把所有文件合并到一起进行性能优化,因此编译器知道一个类是否有子类,因此可以自动推断添加。
默认 release 的编译模式就是 Whole Module。
当然如果你是几个人维护一个项目,这个你写的类主观上不希望被继承,添加 final 是为了警示未来的使用者,那么主动添加也是一个好习惯。起到强文档的作用。
Public 需要主动加
如果你提供的是一个库给上层调用,添加了 public
后需要主动判断是否需要添加 final
。因为标记了 public 类的调用者是未知的,如果不添加默认就是支持被继承的。如果你的类不支持继承,主动添加 final
可以优化性能。