Swift 有些场景其实不必加 final

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 可以优化性能。


Should you add final to all your Swift classes?

相关推荐
Anhty12 小时前
2026最新免费手机音频处理工具 !!
android·功能测试·ios·智能手机·音视频
2501_9159090614 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
初雪云16 小时前
UniApp 云打包拿到 IPA 后,真正的发布工作才刚开始
ios·自动化·编辑器·产品经理·iphone
Lancker17 小时前
没有 Mac 也能上架 iOS:GitHub Actions 全自动构建 + 签名 + TestFlight 送审实录
macos·ios·github
茶底世界之下17 小时前
晚霞要多暖?用 Awaking 只改色温做一次取舍
ios
酒神dnspup19 小时前
多地区网站可用性监控怎么做?DNSPup 从基线到告警的完整实战
运维·ios·云计算·iphone·dns·网络监控
福兮说1 天前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
茶底世界之下2 天前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
ZZH_AI项目交付2 天前
实时字幕负责快,本地录音负责不丢:一个 iOS 录音功能为什么需要两条链路
ios·ai编程
Cc.Y2 天前
Swift深度链接的极简之道
ios·cocoa·swift