Swift 代码审查:检查什么以及如何提供反馈

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Code Review 在 Swift 中:审查什么及如何提供反馈



Code Review 不仅仅是一个形式上的流程,更是提升代码质量和团队专业成长的强大工具。对于使用 Swift 的 iOS/macOS 开发者来说,精心实施的审查有助于避免错误、改善架构并保持统一的代码风格。本文将探讨在 Swift 项目代码审查中应注意哪些方面,以及如何提供有益且不打击士气的反馈。



1. 架构与职责分离



审查时首先要评估的是,代码与所选架构(如 MVC、MVVM、VIPER、SwiftUI + Combine)的契合程度。糟糕的架构会导致“上帝对象”和难以维护的代码。



需要检查什么:

  • ViewController 是否将业务逻辑与 UI 代码混在一起?
  • 网络逻辑是否已提取到单独的服务中(如 NetworkService)?
  • 是否使用协议来实现依赖抽象?
  • 某个类的职责是否过多?


// ❌ 不好:ViewController 直接处理 URLSession 和 JSON 解析class UserViewController: UIViewController {    func fetchUser() {        URLSession.shared.dataTask(with: URL(string: "https://api.example.com/user")!) { data, _, _ in            let user = try? JSONDecoder().decode(User.self, from: data!)            DispatchQueue.main.async {                self.updateUI(with: user)            }        }.resume()    }}

// ✅ 好:逻辑已提取到服务层protocol UserServiceProtocol { func fetchUser(completion: @escaping (Result<User, Error>) -> Void)}

class UserViewModel { private let userService: UserServiceProtocol init(userService: UserServiceProtocol) { self.userService = userService } func loadUser() { userService.fetchUser { [weak self] result in // 处理结果 } }}


反馈建议: 与其说“这个类太大了”,不如这样写:“我发现 UserViewController 既负责网络请求又负责 UI。也许我们可以将请求提取到一个单独的服务中,就像我们在回顾会议上讨论的那样。这样可以简化测试。”



2. 内存安全与生命周期管理



Swift 是一种带有自动引用计数 (ARC) 的语言,但这并不意味着开发人员可以忽视强引用循环的问题。这方面的错误是 iOS 应用程序中内存泄漏的常见原因。



需要检查什么:

  • 在闭包中是否使用了 [weak self] 或 [unowned self]?尤其是在使用 async/await 和 Combine 时。
  • 代理 (delegate) 与其持有者之间是否形成了循环引用?
  • 资源(如观察者、定时器)是否被正确释放?


// ❌ 存在潜在内存泄漏:闭包中对 self 强引用class LocationManager {    var onLocationUpdate: ((CLLocation) -> Void)?        func startUpdating() {        someAsyncAPI { location in            self.onLocationUpdate?(location) // self 被强引用捕获        }    }}

// ✅ 使用 [weak self] 修正class LocationManager { var onLocationUpdate: ((CLLocation) -> Void)? func startUpdating() { someAsyncAPI { [weak self] location in guard let self = self else { return } self.onLocationUpdate?(location) } }}


反馈建议: 不仅要指出问题,还要说明后果:“这里可能会导致内存泄漏,如果 LocationManager 的生命周期比预期更长。我们加上 [weak self] 来打破循环吧。”



3. 错误处理与可选值



Swift 是一种拥有强大可选值系统的强类型语言。对可选值的糟糕处理是常见问题之一。

博客

书籍推荐