SwiftUI 基础:构建简洁应用
核心概念
SwiftUI 的声明式方法在您拥抱其简洁性并抵制过度工程化时,自然地支持构建专注、简洁的应用程序。
为什么独立开发者要选择 SwiftUI
SwiftUI 降低了 iOS 开发的复杂性门槛。您无需管理视图控制器、委托和生命周期方法,而是描述您想要什么,让框架处理如何实现。这意味着更少的样板代码、更少的错误,以及更多时间专注于用户体验。
核心原则
1. 状态是您的唯一真理来源
使用 @State 处理本地视图状态,@StateObject 处理数据模型,@EnvironmentObject 处理应用范围的数据。当状态改变时,视图会自动更新。这消除了与保持 UI 与数据同步相关的整类错误。
2. 组合优于继承
通过组合简单视图来构建复杂视图。设置屏幕只是包含节的列表,节包含行。每个组件都是独立的和可重用的。这使您的代码库更易于理解和维护。
3. 拥抱约束
SwiftUI 的设计系统鼓励一致性。使用标准组件如 NavigationView、List 和 Form。它们开箱即用效果很好,用户已经知道如何与它们交互。定制应该增强而不是替换这些基础。
实际示例:简单的任务列表
这是一个完整的、功能性的 SwiftUI 任务列表:
struct Task: Identifiable {
let id = UUID()
var title: String
var isComplete: Bool
}
struct TaskListView: View {
@State private var tasks = [Task]()
@State private var newTaskTitle = ""
var body: some View {
NavigationView {
List {
ForEach($tasks) { $task in
HStack {
Image(systemName: task.isComplete ? "checkmark.circle.fill" : "circle")
.foregroundColor(task.isComplete ? .green : .gray)
.onTapGesture {
task.isComplete.toggle()
}
TextField("Task", text: $task.title)
}
}
}
.navigationTitle("Tasks")
.toolbar {
Button("Add") {
tasks.append(Task(title: "New Task", isComplete: false))
}
}
}
}
}
就是这样。没有视图控制器,没有委托,没有表视图数据源。只有数据和如何显示它的描述。
要避免的常见错误
过度使用 ObservableObject
并非所有都需要是 ObservableObject。简单状态可以存在于 @State 变量中。只有当您需要跨多个视图共享状态或逻辑足够复杂以值得拥有自己的模型时,才创建 ObservableObject。
与框架作对
如果您发现自己在编写复杂的几何计算或手动布局代码,请退一步。SwiftUI 可能有内置解决方案。HStack、VStack、ZStack 和修饰符处理大多数布局需求。
过早抽象
从简单开始。首先内联构建视图。只有当您真正重用它们或视图变得难以阅读时,才提取组件。抽象是有成本的——确保收益值得。
学习资源
Apple 的官方 SwiftUI 教程非常出色。按顺序学习它们。构建小型、完整的应用程序,而不是无休止地阅读。您从一个完成的应用程序中学到的比从十个半成品教程中学到的更多。
SwiftUI 文档是您最好的参考。当您需要知道视图上有哪些修饰符可用时,在 Xcode 中按住 Command 键并单击它。真正的理解来自构建,而非阅读。
需要把想法真正做成产品?
如果您希望把 SwiftUI 经验直接用到真实项目中,可以先查看 SwiftUI 开发服务页。它解释了 Shawn Studio 如何定义范围、推进原生实现,并把结果推向上线。