AI 生成 Swift 代码的最佳修复实践 (基于 Hacking with Swift)
本文总结了针对 iOS 18+ 环境下,AI 生成的 Swift/SwiftUI 代码中常见的过时或非最佳实践,并提供了相应的现代替代方案。
UI 与 样式 (SwiftUI)
-
颜色与样式
- ❌ 避免:
foregroundColor() - ✅ 推荐:
foregroundStyle()(支持更多样式,不仅限于颜色)
- ❌ 避免:
-
圆角
- ❌ 避免:
cornerRadius() - ✅ 推荐:
clipShape(.rect(cornerRadius:))(支持平滑圆角等更多特性)
- ❌ 避免:
-
字体
- ❌ 避免:
.font(.system(size: 18))(固定大小) - ✅ 推荐:动态类型字体 (如
.font(.body),.font(.headline)),以支持无障碍缩放。
- ❌ 避免:
-
布局与几何
- ❌ 避免:滥用
GeometryReader和硬编码 Frame。 - ✅ 推荐:优先使用
visualEffect()或containerRelativeFrame()。
- ❌ 避免:滥用
-
列表与导航
- ❌ 避免:
NavigationView - ✅ 推荐:
NavigationStack - ❌ 避免:在 List 中使用内联
NavigationLink - ✅ 推荐:使用
navigationDestination(for:)进行数据驱动导航。
- ❌ 避免:
交互与状态管理
-
按钮
- ❌ 避免:给普通 View 加
onTapGesture() - ✅ 推荐:使用
Button(更好的无障碍支持和点击态)。 - ❌ 避免:
Label("Title", systemImage: "icon")作为 Button 内容 - ✅ 推荐:
Button("Title", systemImage: "icon") { ... }(内联 API)。
- ❌ 避免:给普通 View 加
-
状态观察
- ❌ 避免:
ObservableObject+@Published - ✅ 推荐:
@Observable宏 (更简单,性能更好,View 更新更精准)。 - 注意:在使用
@Observable时,应将计算属性中的复杂 View 拆分为独立的 SwiftUI View,以避免不必要的整体刷新。
- ❌ 避免:
-
变化监听
- ❌ 避免:
onChange(of: value) { newValue in }(单参数闭包,已弃用) - ✅ 推荐:
onChange(of: value) { oldValue, newValue in }(双参数闭包)。
- ❌ 避免:
数据与并发 (Swift / SwiftData)
-
SwiftData 与 CloudKit
- ⚠️ 警告:
@Attribute(.unique)与 CloudKit 不兼容。如果启用 iCloud 同步,必须移除唯一性约束。
- ⚠️ 警告:
-
并发
- ❌ 避免:滥用
DispatchQueue.main.async - ✅ 推荐:现代并发模型。注意新项目默认启用 Main Actor 隔离,通常无需手动标记。
- ❌ 避免:
Task.sleep(nanoseconds:) - ✅ 推荐:
Task.sleep(for:)(更易读的时间单位)。
- ❌ 避免:滥用
-
文件系统
- ❌ 避免:繁琐的
FileManager查找代码。 - ✅ 推荐:
URL.documentsDirectory。
- ❌ 避免:繁琐的
代码结构与格式
-
图片渲染
- ❌ 避免:
UIGraphicsImageRenderer - ✅ 推荐:
ImageRenderer(SwiftUI 原生)。
- ❌ 避免:
-
格式化
- ❌ 避免:
String(format: "%.2f", value) - ✅ 推荐:
value.formatted()(Swift 原生格式化 API)。
- ❌ 避免:
-
代码组织
- ❌ 避免:将大量类型定义在同一个文件中 (增加编译时间)。
- ✅ 推荐:每个类型一个文件。
-
Tab 视图
- ❌ 避免:旧版
.tabItem() - ✅ 推荐:新版 Tab API (iOS 18+)。
- ❌ 避免:旧版