Swift 整洁代码:如何编写让同事不诅咒你的代码

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

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

开始课程

如何编写 Swift 整洁代码:尊重自己与同事的指南

\n\n

每位开发者都曾打开过自己半年前写的项目,却看不懂其中的逻辑。或者曾在代码审查中收到这样的评论:“这段代码可以写得更简单。” 熟悉吗?如果是,那么这篇文章就是为你准备的。

\n\n

Swift 整洁代码不仅仅是完美主义者的执念。它是一种能节省数小时调试时间和精力的工具。当你编写整洁的代码时,不仅加快了自己的工作进度,也让项目对团队更加透明。让我们来探讨如何将你的 Swift 代码变成艺术品。

\n\n

规则一:命名是重中之重

\n\n

最常见的错误是将变量命名为 x 或 temp。之后另一位开发者看到代码时会想:“这个 x 是什么?坐标?数量?”

\n\n

在 Swift 中,通常使用读起来像句子的名称。这不仅美观,还能帮助立即理解代码的功能。

\n\n
// 糟糕的命名\nlet a = 5.0\nvar b = "John"\n\n// 良好的命名\nlet discountRate = 5.0\nvar userName = "John"
\n\n

函数和方法也遵循同样的规则。名称应回答“这个方法做什么?”这个问题。使用祈使动词:

\n\n
// 糟糕的命名\nfunc data() -> [String] { ... }\n\n// 良好的命名\nfunc fetchUsers() -> [String] { ... }
\n\n

如果函数返回布尔值,则以 is、has 或 contains 开头:

\n\n
func isUserLoggedIn() -> Bool\nfunc hasValidEmail() -> Bool
\n\n

规则二:可选类型不是敌人,而是工具

\n\n

许多新手害怕可选类型,并试图不惜一切代价避免使用它们。他们到处写 if let,或者更糟的是,强制解包。但 Swift 整洁代码是能够安全处理 nil 的代码。

\n\n

请记住:! 是一种求救信号。仅在你绝对确定值不为 nil 时使用它(例如,处理 IBOutlet 时)。

\n\n
// 危险代码\nlet name = optionalName!\n\n// 安全版本\nguard let name = optionalName else {\n    return\n}\nprint(name)
\n\n

对于可选链,使用 ? 和 nil 合并运算符:

\n\n
let userCity = user?.address?.city ?? "未知"
\n\n

即使 user 或 address 为 nil,这段代码也不会崩溃。而且它读起来像普通句子:“用户的所在城市,或‘未知’”。

\n\n

规则三:尽可能使用结构体代替类

\n\n

Swift 中既有类也有结构体。但许多人习惯性地到处使用类。这是错误的。结构体是值类型,在多线程代码中更安全。此外,它们是复制而非引用,从而降低了副作用的风险。

\n\n

在以下情况下使用结构体:

\n
    \n
  • 需要存储数据且无需复杂逻辑
  • \n
  • 不需要继承
  • \n
  • 对象在创建后不应被修改
  • \n
\n\n
// 最好使用结构体\nstruct User {\n    let id: Int\n    var name: String\n}\n\n// 仅在需要继承或引用语义时使用类\nclass ViewController: UIViewController { ... }
\n\n

顺便一提,Apple 建议对数据模型使用结构体。这是 Swift 整洁代码的主要原则之一。

\n\n

规则四:协议是你最好的朋友

\n\n

Swift 中的协议不仅仅是接口。它们是使代码灵活且可测试的方式。与其绑定到特定类,不如通过协议进行工作。

\n\n
protocol NetworkServiceProtocol {\n    func fetchData(completion: @escaping (Result<Data, Error>) -> Void)\n}\n\nclass APIService: NetworkServiceProtocol { ... }\nclass MockService: NetworkServiceProtocol { ... }
\n\n

现在,你可以轻松地将真实服务替换为用于测试的模拟服务。而且无需更改其他地方的代码。

博客

书籍推荐