Swift 的拜访权限操控有一个关键字是 final,加了 final 后表示这个类便是最终的样子了。有两个效果:

  • 不能被 override,由于是最终版了,所以不能被改。
  • 优化执行功能。由于一切的办法调用只要一个清晰途径(不存在子类),不需求到 vtable 中去查一下。

听起来为了规范,一切的不需求考虑承继的类都应该加上 final,可是一个项目里这么多类都加上其实也有点累人。很多人不知道的是其实有一些场景不需求自己手动增加。

私有类/属性不用增加

假如你的类的拜访属性是 private 或者 fileprivate,由于只要在当前文件才能被拜访,天然就不存在被外部拜访承继的可能性,编译器会自动揣度增加 final。所以这种情况下不用增加 final

默许拜访权限(internal)也不用加

假如咱们不增加拜访权限,默许的拜访权限的级别是 internal,表示只要当前 framework 内可以被拜访。假如咱们挑选的编译形式是Whole Module Optimization (WMO),那么咱们也不需求手动增加 final

由于 WMO 会把一切文件合并到一同进行功能优化,因而编译器知道一个类是否有子类,因而可以自动揣度增加。

默许 release 的编译形式便是 Whole Module。

Swift 有些场景其实不用加 final

当然假如你是几个人维护一个项目,这个你写的类主观上不希望被承继,增加 final 是为了警示未来的使用者,那么自动增加也是一个好习惯。起到强文档的效果。

Public 需求自动加

假如你供给的是一个库给上层调用,增加了 public 后需求自动判别是否需求增加 final。由于标记了 public 类的调用者是未知的,假如不增加默许便是支撑被承继的。假如你的类不支撑承继,自动增加 final 可以优化功能。


Should you add final to all your Swift classes?