LESSON 12 / 576 分钟

View、body 与 Modifier

SwiftUI 描述“当前状态应该显示什么”,框架负责更新具体界面。

用你的前端经验理解

View 类似 React 组件,body 类似渲染描述。但它不是 DOM,modifier 也不是 CSS 声明块。

为什么需要它

SwiftUI 的 View 是界面描述,不是你手动创建并长期持有的屏幕控件。body 根据当前输入生成描述,框架再据此协调真实界面。理解这个区别后,就不会把 View 初始化次数当作页面出现次数,也不会在 body 求值过程中写文件或发请求。

它是怎样工作的

Modifier 按顺序包装已有视图,最终结果仍是 View。padding 后再加背景,背景覆盖扩大的区域;先背景后 padding,外面的留白不属于背景。some View 表示具体返回类型由实现确定,只是对调用者隐藏;条件分支通常由 ViewBuilder 组织,而非任意类型都能随便互换。

把关键概念连起来

1

组合

用小 View 组合界面,属性传入数据。body 返回 some View,由编译器保留具体视图结构。

2

修饰

.font、.padding、.background 返回经过修饰的视图。顺序会改变包裹关系和结果。

3

纯描述

body 可能被多次求值,避免在里面发请求、保存数据或做重计算。副作用放进动作或生命周期修饰器。

Swift · 示例片段
Text("稍后阅读")    .padding(16)    .background(.blue.opacity(0.12))    .clipShape(RoundedRectangle(cornerRadius: 16))
  • 文字先得到内边距,背景包住内边距,最后裁剪整体形状。

用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。

用一张文章卡片理解组合

  1. 先写只显示标题和作者的 ArticleCard,通过普通属性接收数据,让它可以单独预览。
  2. 将按钮动作从外部传入,卡片只发出“收藏”意图,不自行创建网络客户端;这样同一视图可以服务预览和真实页面。
  3. 比较两种 modifier 顺序,并检查点击区域与背景是否一致。视觉上的空白也可能影响用户能否方便点击。

这里需要你亲自判断

不要在 body 中依赖“只执行一次”的假设;不要把每个 modifier 当作随意排序的 CSS 属性。

做一个小练习

交换 .padding() 与 .background(),观察背景是否包住内边距。

  1. 把标题、作者、收藏按钮拆成一个小 View,提供长标题和缺少作者的预览数据。
  2. 交换 padding 与 background,先画出嵌套关系再验证。
展开参考思路与验收标准

两个版本的背景范围应不同。拆 View 的依据是职责、复用和可读性,不是每个 Text 都必须独立成文件;body 应能被重复求值而不产生额外业务操作。

打开对应交互实验

padding 和 background 顺序是否影响结果?

继续查阅官方资料
Apple Developer 官方资料

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成