如何编写 Swift 整洁代码:尊重自己与同事的指南
\n\n每位开发者都曾打开过自己半年前写的项目,却看不懂其中的逻辑。或者曾在代码审查中收到这样的评论:“这段代码可以写得更简单。” 熟悉吗?如果是,那么这篇文章就是为你准备的。
\n\nSwift 整洁代码不仅仅是完美主义者的执念。它是一种能节省数小时调试时间和精力的工具。当你编写整洁的代码时,不仅加快了自己的工作进度,也让项目对团队更加透明。让我们来探讨如何将你的 Swift 代码变成艺术品。
\n\n规则一:命名是重中之重
\n\n最常见的错误是将变量命名为 x 或 temp。之后另一位开发者看到代码时会想:“这个 x 是什么?坐标?数量?”
在 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 开头:
func isUserLoggedIn() -> Bool\nfunc hasValidEmail() -> Bool\n\n规则二:可选类型不是敌人,而是工具
\n\n许多新手害怕可选类型,并试图不惜一切代价避免使用它们。他们到处写 if let,或者更糟的是,强制解包。但 Swift 整洁代码是能够安全处理 nil 的代码。
请记住:! 是一种求救信号。仅在你绝对确定值不为 nil 时使用它(例如,处理 IBOutlet 时)。
// 危险代码\nlet name = optionalName!\n\n// 安全版本\nguard let name = optionalName else {\n return\n}\nprint(name)\n\n对于可选链,使用 ? 和 nil 合并运算符:
let userCity = user?.address?.city ?? "未知"\n\n即使 user 或 address 为 nil,这段代码也不会崩溃。而且它读起来像普通句子:“用户的所在城市,或‘未知’”。
规则三:尽可能使用结构体代替类
\n\nSwift 中既有类也有结构体。但许多人习惯性地到处使用类。这是错误的。结构体是值类型,在多线程代码中更安全。此外,它们是复制而非引用,从而降低了副作用的风险。
\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\nSwift 中的协议不仅仅是接口。它们是使代码灵活且可测试的方式。与其绑定到特定类,不如通过协议进行工作。
\n\nprotocol NetworkServiceProtocol {\n func fetchData(completion: @escaping (Result<Data, Error>) -> Void)\n}\n\nclass APIService: NetworkServiceProtocol { ... }\nclass MockService: NetworkServiceProtocol { ... }\n\n现在,你可以轻松地将真实服务替换为用于测试的模拟服务。而且无需更改其他地方的代码。