关键要点
View Protocol 是SwiftUI的核心协议。它只需要一个属性:var body: some View。body是一个返回UI描述的计算属性。SwiftUI在每次状态变化时调用body并在GPU上渲染结果。
@ViewBuilder 是View的Result Builder。它允许在闭包内编写多个View而无需return和TupleView。它支持if/else、switch、ForEach。所有容器(VStack、HStack、ZStack、Group)都使用@ViewBuilder。替代方案是Group { … }用于无布局分组。some View 是一种不透明类型(Opaque Type)。编译器知道具体的View类型(Text、Button、VStack等),但外部返回为some View。这允许在不改变签名的情况下更改body类型。ViewModifier — View修饰符:.font()、.padding()、.background()。通过ViewModifier协议和.modifier()自定义修饰符。
// 使用@ViewBuilder和NavigationStack的View示例
struct ContentView: View {
@State private var items = ["Item 1", "Item 2"]
var body: some View {
NavigationStack {
List(items, id: .self) { item in
NavigationLink(item) {
DetailView(item: item)
}
}
.navigationTitle("Items")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Add") {
items.append("New Item")
}
}
}
}
}
}
// 使用@StateObject的DetailView
struct DetailView: View {
let item: String
@StateObject private var viewModel = DetailViewModel()
var body: some View {
Text(item)
.task {
await viewModel.loadDetails(for: item)
}
}
}NavigationStack (iOS 16+) — 数据驱动导航。接受路径(可哈希值数组)并通过navigationDestination显示目标。替代带目标视图的NavigationLink。NavigationLink — 用于堆栈导航的按钮。List — 支持分区、滑动、删除和拖拽的垂直列表。Form — 专门用于设置的List:分区、选择器、开关、文本字段。Section — List/Form中带标题和页脚的分组。ViewModifier — 用于重用样式的自定义修饰符。.modifier(CustomModifier()) — 应用。
List在SwiftUI中相当于UITableView。支持.onDelete、.onMove、.refreshable。SwipeActions — .swipeActions { Button("删除", role: .destructive) { } }。Form — 针对设置优化:DatePicker、Toggle、Stepper、Picker。带标题/页脚的Section — 用于分组。OutlineGroup — 层次列表(相当于带分区的UITableView)。DisclosureGroup — 可折叠的分区。IT Sectr建议将List用于数据,Form用于设置。
PreviewProvider — Xcode Canvas中预览的协议。Canvas — 交互式SwiftUI预览(需要@main和Swift 5.9+)。@ScaledMetric — 随Dynamic Type缩放的自适应尺寸。
Property Wrappers 是SwiftUI中状态管理的基础。@State — 本地状态(值类型)。@Binding — 与父状态连接。@StateObject — 创建ObservableObject。SwiftUI管理对象的生命周期。@ObservedObject — 观察外部ObservableObject。@EnvironmentObject — 来自环境的对象(通过.environmentObject()进行依赖注入)。@Environment — 系统值(.colorScheme、.locale)。@AppStorage — UserDefaults。@FetchRequest — Core Data查询。@FocusState — 输入焦点。
| 包装器 | 用途 | 所有权 |
|---|---|---|
| @State | 本地状态(值类型) | View拥有 |
| @Binding | 与父状态连接 | 父级拥有 |
| @StateObject | 创建ObservableObject | View拥有 |
| @ObservedObject | 观察外部对象 | 外部拥有者 |
| @EnvironmentObject | 来自环境的对象 | 祖先拥有 |
| @Environment | 系统值 | 系统 |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | 输入焦点 | View拥有 |
@StateObject vs @ObservedObject:@StateObject创建对象,@ObservedObject观察对象。在层次结构中首次创建模型使用@StateObject,传递给子视图使用@ObservedObject。@FocusState — 焦点管理:.focused($field, equals: .email)。支持enum处理多个字段。
@Environment — 系统值:colorScheme、locale、sizeCategory、layoutDirection、managedObjectContext。自定义环境值 — 通过EnvironmentKey自定义值。用于依赖注入:无需显式参数传递服务。.environment()修饰符 — 在层次结构中设置值。@EnvironmentObject — 来自.environmentObject()的ObservableObject。与@Environment的区别在于它传递引用类型。IT Sectr建议将@Environment用于系统值,@EnvironmentObject用于服务。
.task{} — 视图出现时的异步操作。消失时自动取消。替代.onAppear用于async/await。.onAppear{} — 出现时的同步操作。.onDisappear{} — 消失时的操作。.onChange(of:) — 值变化时响应。.onReceive(Publisher) — 对Combine发布者响应。SwiftUI中View的生命周期:init → onAppear → body(渲染)→ onDisappear。状态变化时:body → diff → 重新渲染。IT Sectr建议将.task用于异步加载,.onAppear用于分析统计。
.animation() — 动画修饰符。.transition() — 出现/消失动画。withAnimation — 显式状态变化动画。matchedGeometryEffect — 不同视图之间的动画(英雄动画)。PhaseAnimator (iOS 17+) — 基于enum的多阶段动画。KeyframeAnimator (iOS 17+) — 基于关键帧的逐帧动画。SwiftUI动画通过Core Animation在GPU上运行。IT Sectr建议自然动画使用.spring(),物理效果使用.interpolatingSpring。
ObservableObject — 具有@Published属性的对象的协议。SwiftUI订阅objectWillChange发布者。@Published — 发布属性更改。@StateObject — 创建ObservableObject,管理生命周期。@ObservedObject — 观察外部对象。Combine — 响应式编程框架。@EnvironmentObject — 通过环境的依赖注入。.environmentObject()设置,@EnvironmentObject读取。MVVM — 标准架构:View(SwiftUI)— ViewModel(ObservableObject)— Model。IT Sectr建议对主要ViewModel使用MVVM + @StateObject。
class UserViewModel: ObservableObject {
@Published var users: [User] = []
@Published var isLoading = false
func loadUsers() async {
isLoading = true
defer { isLoading = false }
do {
users = try await api.fetchUsers()
} catch {
print("错误:\(error)")
}
}
}
struct UsersView: View {
@StateObject private var viewModel = UserViewModel()
var body: some View {
List(viewModel.users, id: \.id) { user in
Text(user.name)
}
.task { await viewModel.loadUsers() }
.overlay {
if viewModel.isLoading { ProgressView() }
}
}
}无障碍在SwiftUI中:.accessibilityLabel()、.accessibilityHint()、.accessibilityValue()、.accessibilityAddTraits()。VoiceOver读取无障碍标签。Dynamic Type — @ScaledMetric、@DynamicProperty。本地化:String(localized:)(SwiftUI + String Catalog)。LocalizedStringKey — 自动翻译。复数规则 — 通过String Catalog(one、few、many、other)。从右到左(阿拉伯语、希伯来语)— 自动支持。.environment(.layoutDirection, .rightToLeft)。IT Sectr建议为所有交互元素添加无障碍标签。
struct AccessibleButton: View {
let action: () -> Void
var body: some View {
Button(action: action) {
Label("Settings", systemImage: "gear")
}
.accessibilityLabel("Open Settings")
.accessibilityHint("Double tap to navigate to settings screen")
.accessibilityAddTraits(.isButton)
}
}
// Dynamic Type支持
struct ScalableText: View {
@ScaledMetric private var fontSize: CGFloat = 17
var body: some View {
Text("Hello, World!")
.font(.system(size: fontSize))
}
}Swift Charts (iOS 16+) — 构建图表的框架。Chart { } — 基本容器。BarMark、LineMark、PointMark、AreaMark、RuleMark — 标记。ForEach用于数据。ChartAxis — 轴自定义。.chartXAxis、.chartYAxis。ChartLegend — 图例。插值 — catmullRom、linear、step。动画 — 用于Chart的.animation()。IT Sectr建议内置图表使用Swift Charts,复杂图表使用Charts(DGCharts)。
import Charts
struct MonthlySales: Identifiable {
let id = UUID()
let month: String
let sales: Double
}
struct SalesChart: View {
let data: [MonthlySales]
var body: some View {
Chart(data) { item in
BarMark(
x: .value("Month", item.month),
y: .value("Sales", item.sales)
)
.foregroundStyle(.blue.gradient)
}
.chartXAxisLabel("Month")
.chartYAxisLabel("Sales")
.frame(height: 200)
.padding()
}
}Swift Package Manager (SPM) — Apple的依赖管理器。集成在Xcode中。支持:二进制包、资源、测试、swift-6严格并发。通过GitHub发布包并附带semver标签。SPM是Swift依赖的事实标准,正在取代CocoaPods和Carthage。IT Sectr建议所有新项目使用SPM。
Swift Concurrency (async/await、TaskGroup、AsyncSequence) — async/await内置于Swift 5.5+。Task — 异步单元。TaskGroup — 并行任务。AsyncSequence — 异步序列(AsyncStream、AsyncAlgorithms)。Task Local Values — Task的上下文数据。Swift Concurrency完全取代Combine进行异步操作。
常见问题
View Protocol 是基础协议。需要var body: some View。body是在GPU上渲染的UI描述。
@ViewBuilder 是多个View的Result Builder。允许在容器中使用if/else、switch、ForEach。
@StateObject 创建对象。@ObservedObject 观察现有对象。在层次结构中首次创建使用@StateObject。
NavigationStack — 数据驱动导航。基于路径,深度链接。替代NavigationView。
@FocusState — 输入焦点管理。.focused()修饰符。支持enum处理多个字段。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。