LESSON 12 / 576 分钟
View、body 与 Modifier
SwiftUI 描述“当前状态应该显示什么”,框架负责更新具体界面。
用你的前端经验理解
View 类似 React 组件,body 类似渲染描述。但它不是 DOM,modifier 也不是 CSS 声明块。
01 / 理解问题
为什么需要它
SwiftUI 的 View 是界面描述,不是你手动创建并长期持有的屏幕控件。body 根据当前输入生成描述,框架再据此协调真实界面。理解这个区别后,就不会把 View 初始化次数当作页面出现次数,也不会在 body 求值过程中写文件或发请求。
它是怎样工作的
Modifier 按顺序包装已有视图,最终结果仍是 View。padding 后再加背景,背景覆盖扩大的区域;先背景后 padding,外面的留白不属于背景。some View 表示具体返回类型由实现确定,只是对调用者隐藏;条件分支通常由 ViewBuilder 组织,而非任意类型都能随便互换。
02 / 掌握要点
把关键概念连起来
1
组合
用小 View 组合界面,属性传入数据。body 返回 some View,由编译器保留具体视图结构。
2
修饰
.font、.padding、.background 返回经过修饰的视图。顺序会改变包裹关系和结果。
3
纯描述
body 可能被多次求值,避免在里面发请求、保存数据或做重计算。副作用放进动作或生命周期修饰器。
READ THE CODE
Swift · 示例片段
Text("稍后阅读") .padding(16) .background(.blue.opacity(0.12)) .clipShape(RoundedRectangle(cornerRadius: 16))- 文字先得到内边距,背景包住内边距,最后裁剪整体形状。
用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。
03 / 案例推演
用一张文章卡片理解组合
- 先写只显示标题和作者的 ArticleCard,通过普通属性接收数据,让它可以单独预览。
- 将按钮动作从外部传入,卡片只发出“收藏”意图,不自行创建网络客户端;这样同一视图可以服务预览和真实页面。
- 比较两种 modifier 顺序,并检查点击区域与背景是否一致。视觉上的空白也可能影响用户能否方便点击。
这里需要你亲自判断
不要在 body 中依赖“只执行一次”的假设;不要把每个 modifier 当作随意排序的 CSS 属性。
04 / 动手验证
做一个小练习
交换 .padding() 与 .background(),观察背景是否包住内边距。
- 把标题、作者、收藏按钮拆成一个小 View,提供长标题和缺少作者的预览数据。
- 交换 padding 与 background,先画出嵌套关系再验证。
展开参考思路与验收标准
两个版本的背景范围应不同。拆 View 的依据是职责、复用和可读性,不是每个 Text 都必须独立成文件;body 应能被重复求值而不产生额外业务操作。
05 / 检查理解
padding 和 background 顺序是否影响结果?
答对理解题后即可标记完成