Swift / SwiftUI 条目式速查字典。教程见《Swift / SwiftUI 环境搭建》系列。
1. 可选值解包四式
描述
?? 兜底、if let 作用域解包、guard let 提前退出、! 强解(仅确信时)。
语法和示例
var name: String? = nil
let show = name ?? "匿名"
if let n = name { use(n) } // 仅作用域内
guard let n = name else { return } // 之后直接用 n
// name!.length 只用于不可能为 nil 的场合2. @State / @Binding / @Observable
描述
三层状态:视图私有、父子双向、模型共享;body 只追踪实际读取的属性。
语法和示例
struct Editor: View {
@State private var draft = ""
var body: some View { TextField("写", text: $draft) } // $ 桥 Binding
}
@Observable class Model { var items: [Item] = [] }
struct V: View {
@State private var model = Model() // 持有 @Observable
var body: some View { ForEach(model.items) { ... } }
}3. guard 与 defer
描述
guard 提前退出减少嵌套;defer 离作用域必执行(清理惯用法)。
语法和示例
func work() throws {
defer { cleanup() }
guard let key = load() else { throw Err.missing }
try risky(key)
}4. struct 与 class 选型
描述
struct 值语义默认(SwiftUI 首选);需要共享身份/继承才 class。
语法和示例
struct Point: Hashable { var x, y: Double } // 值拷贝
class Repo { var cache: [String: Data] = [:] } // 引用共享
// class 需注意逃逸闭包里的 self 循环引用——用 [weak self]5. 协议与扩展
描述
协议声明能力;扩展给任何类型注入方法(含默认实现)。
语法和示例
extension String {
var slug: String { lowercased().replacingOccurrences(of: " ", with: "-") }
}
protocol Greeter { func greet() -> String }
extension Greeter { func greet() -> String { "hi" } } // 默认实现6. NavigationStack
描述
值驱动导航:NavigationLink(value:) + navigationDestination;深链友好。
语法和示例
NavigationStack {
List(items) { item in
NavigationLink(value: item.id) { Text(item.title) }
}
.navigationDestination(for: Int.self) { id in Detail(id: id) }
}
// 编程式:path.append(42);绑定 NavigationStack(path: $path)7. Task 与结构化并发
描述
async let 并行;Task 非结构化入口;.task 修饰符随视图生命周期自动取消。
语法和示例
async let a = fetchA()
async let b = fetchB()
let (x, y) = try await (a, b) // 并行等待
// .task { await model.reload() } // 视图消失自动 cancel
Task.detached(priority: .background) { heavy() }8. actor 数据隔离
描述
串行访问保证;@MainActor 标 UI 隔离(视图模型建议标注)。
语法和示例
actor Cache {
private var store: [String: Data] = [:]
func get(_ k: String) -> Data? { store[k] }
}
@MainActor class ViewModel { /* UI 安全 */ }
// .task 的闭包不接收 throwing:内部 try? 或 do/catch9. sheet 与数据驱动模态
描述
item 非 nil 即弹;onDismiss 收尾。
语法和示例
@State private var editing: Doc?
.sheet(item: $editing) { doc in Editor(doc: doc) }
.sheet(isPresented: $flag) { Picker() }10. 列表身份与动画
描述
ForEach 要 Identifiable;动画绑 value 精确触发。
语法和示例
ForEach(items) { ... } // Item: Identifiable
ForEach(arr, id: \.self) { ... } // 无 id 型的兜底
withAnimation(.spring) { list.toggleFlag(id) }
List { ... }.animation(.spring, value: model.items)11. Self._printChanges
描述
body 首行打印触发重算的状态来源——性能排查第一刀。
语法和示例
var body: some View {
Self._printChanges() // 控制台看是谁触发的
content
}12. UIKit 互操作
描述
Representable 包装成熟 UIKit 控件;Coordinator 转发代理。
语法和示例
struct MapWrap: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> MapVC { .init() }
func updateUIViewController(_ vc: MapVC, context: Context) {}
func makeCoordinator() -> Coord { Coord() } // 代理回调经它回 SwiftUI
}