Swift中的Clean Code:原则与实践示例

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

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

开始课程

Swift中的Clean Code:原则与实践示例

\n\n

干净代码(Clean Code)不仅仅是一个流行术语,更是专业开发人员的基本技能。在Swift(iOS/macOS)生态系统中,代码质量直接影响开发速度、错误数量以及项目维护的便利性。在本文中,我们将探讨适用于Swift的Clean Code关键原则,并通过实际示例展示其实现。

\n\n

1. 命名:使用领域语言表达

\n\n

好的变量、函数或类名可以替代注释。在Swift中,凭借其丰富的类型系统和可选值,正确的命名尤为重要。

\n\n

糟糕的示例:

\n
func calc(a: [String: Any]) -> Double {\n    var x = 0.0\n    for (_, v) in a {\n        if let n = v as? Double {\n            x += n\n        }\n    }\n    return x\n}
\n\n

良好的示例(Clean Code):

\n
func calculateTotalPrice(of products: [Product]) -> Double {\n    return products.reduce(0) { $0 + $1.price }\n}
\n\n

Swift中的命名原则:

\n
    \n
  • 清晰优于简洁: remove(at:) 优于 rem(at:)。
  • \n
  • 类型使用名词: UserViewController、NetworkManager。
  • \n
  • 函数使用动词: fetchData()、saveToCache()。
  • \n
  • 布尔变量: 以 is、has、should 开头 — isEnabled、hasContent。
  • \n
  • 避免缩写: 使用 backgroundColor 而非 bgColor。
  • \n
\n\n

2. Swift中的单一职责原则(SRP)

\n\n

每个类、结构体或函数应该只有一个修改的理由。在iOS开发中,这一点对于ViewController尤为重要,因为它们常常变成“上帝对象”。

\n\n

违反SRP(典型的ViewController):

\n
class ProfileViewController: UIViewController {\n    @IBOutlet weak var nameLabel: UILabel!\n    @IBOutlet weak var avatarImageView: UIImageView!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        // 加载数据\n        let url = URL(string: "https://api.example.com/user")!\n        let data = try! Data(contentsOf: url)\n        let json = try! JSONSerialization.jsonObject(with: data) as! [String: Any]\n        nameLabel.text = json["name"] as? String\n        \n        // 加载头像\n        let imageUrl = URL(string: json["avatar"] as! String)!\n        let imageData = try! Data(contentsOf: imageUrl)\n        avatarImageView.image = UIImage(data: imageData)\n        \n        // 保存到缓存\n        UserDefaults.standard.set(json, forKey: "cachedUser")\n    }\n}
\n\n

遵循SRP的重构:

\n
// 1. 独立的网络服务\nclass UserNetworkService {\n    func fetchUser(completion: @escaping (Result<User, Error>) -> Void) {\n        // ... 网络逻辑\n    }\n}\n\n// 2. 独立的缓存管理器\nclass UserCacheManager {\n    func saveUser(_ user: User) {\n        // ... 缓存逻辑\n    }\n}\n\n// 3. 用于业务逻辑的ViewModel\nclass ProfileViewModel {\n    private let networkService = UserNetworkService()\n    private let cacheManager = UserCacheManager()\n    \n    func loadProfile(completion: @escaping (User) -> Void) {\n        networkService.fetchUser { [weak self] result in\n            switch result {\n            case .success(let user):\n                self?.cacheManager.saveUser(user)\n                completion(user)\n            case .failure:\n                // 出错时从缓存加载\n                if let cachedUser = self?.cacheManager.lo                

博客

书籍推荐