swiftui-view-refactor - mv-patterns
MV 模式参考关于判断某个 SwiftUI 功能应保持纯 MV 还是引入视图模型的精炼指导。灵感来源于用户提供的资料《SwiftUI in 2025: Forget MVVM》Thomas Ricouard但在此重写为实用的重构参考。默认立场默认使用 MV视图是轻量的状态表达式和编排点。在转向视图模型之前优先使用State、Environment、Query、.task、.task(id:)和onChange。将业务逻辑保留在服务、模型或领域类型中而不是视图 body 中。在发明视图模型层之前先将大型界面拆分为更小的视图类型。避免手动获取数据或状态管道以免重复 SwiftUI 或 SwiftData 的机制。优先测试服务、模型和转换逻辑视图应保持简单和声明式。何时避免视图模型当视图模型主要是为了以下目的时不要引入它镜像局部视图状态包装已可通过Environment获得的值重复Query、State或Binding驱动的数据流仅仅因为视图 body 太长而存在承载一次性异步加载逻辑而这些逻辑本可以放在.task加局部视图状态中。在这些情况下请简化视图和数据流而不是增加间接层。何时可以合理使用视图模型当以下条件至少满足其一视图模型才是合理的用户明确要求使用视图模型代码库已针对该功能标准化了视图模型模式界面需要一个长期存在的引用模型其行为无法自然地完全放入服务中该功能正在适配一个非 SwiftUI 的 API需要一个专门的桥接对象多个视图共享相同的、特定于展示层的状态而该状态不适合建模为应用级环境数据。即便如此也要尽量让视图模型小巧、明确且非可选。推荐模式局部状态加环境structFeedView:View{Environment(BlueSkyClient.self)privatevarclientenumViewState{caseloadingcaseerror(String)caseloaded([Post])}StateprivatevarviewState:ViewState.loadingvarbody:someView{List{switchviewState{case.loading:ProgressView(Loading feed...)case.error(letmessage):ErrorStateView(message:message,retryAction:{awaitloadFeed()})case.loaded(letposts):ForEach(posts){postinPostRowView(post:post)}}}.task{awaitloadFeed()}}privatefuncloadFeed()async{do{letpoststryawaitclient.getFeed()viewState.loaded(posts)}catch{viewState.error(error.localizedDescription)}}}为什么推荐这样做状态保持在渲染它的 UI 附近依赖来自环境而不是包装对象视图协调 UI 流程而服务负责真正的工作。推荐模式将修饰符用作轻量编排.task(id:searchText){guard!searchText.isEmptyelse{results[]return}awaitsearchFeed(query:searchText)}.onChange(of:isInSearch,initial:false){guard!isInSearchelse{return}Task{awaitfetchSuggestedFeed()}}使用视图生命周期修饰符进行简单、局部的编排。默认不要将这些转换为视图模型除非行为明显超出了视图的承载能力。SwiftData 说明SwiftData 是尽可能将数据流保留在视图内的有力论据。推荐structBookListView:View{Queryprivatevarbooks:[Book]Environment(\.modelContext)privatevarmodelContextvarbody:someView{List{ForEach(books){bookinBookRowView(book:book).swipeActions{Button(Delete,role:.destructive){modelContext.delete(book)}}}}}}避免添加手动获取并镜像相同状态的视图模型除非该功能有明确的理由这样做。测试指导优先测试服务和业务规则模型和状态转换服务层的异步工作流通过预览或更高级别的 UI 测试验证 UI 行为。不要仅仅为了让简单的 SwiftUI 视图可测试而引入视图模型。那通常只会增加仪式感而无助于改善架构。重构检查清单向 MV 重构时移除仅包装环境依赖或局部视图状态的视图模型。当纯视图状态足够时替换可选的或延迟初始化的视图模型。将业务逻辑从视图 body 中抽出放入服务/模型中。保持视图作为 UI 状态、导航和用户操作的薄协调器。在添加新的间接层之前将大型 body 拆分为更小的视图类型。结论将视图模型视为例外而不是默认。在现代 SwiftUI 中默认技术栈是局部状态使用State共享依赖使用EnvironmentSwiftData 支持的集合使用Query轻量编排使用生命周期修饰符业务逻辑使用服务和模型。只有当功能确实需要时才使用视图模型。

相关新闻

家具行业 AI 生图工具选型指南:从参数对比到实操落地

家具行业 AI 生图工具选型指南:从参数对比到实操落地

摘要:本文面向产业带家具人,聚焦 AI 生图工具的选型问题。文章先以 2026 年一季度行业利润率跌至 1.6% 的数据切入,指出图片生产力是被低估的隐形竞争力;随后从材质库、商用授权、结构保真、出图速度等九维参数对比通用 AI 与家具…

2026/10/10 6:00:46 阅读更多 →
FastAdmin后台自定义导出实战:多表关联、筛选条件与性能优化

FastAdmin后台自定义导出实战:多表关联、筛选条件与性能优化

FastAdmin 后台里最常见的需求,排在第一的是“做个导出”,第二是“不要导出全部字段”。用 FastAdmin 做过几个后台项目之后,你会发现它自带的导出按钮确实方便——CRUD 一键生成,列表页自带导出入口,但默认导出是“所…

2026/10/10 6:00:46 阅读更多 →
swiftui-ui-patterns - theming

swiftui-ui-patterns - theming

主题化与动态字体 意图 提供清晰、可扩展的主题化方案,使视图代码保持语义化和一致性。 核心模式 使用单个 Theme 对象作为唯一事实来源(颜色、字体、间距)。在应用根节点注入主题,并在视图中通过 Environment(Theme.self) 读取。…

2026/10/10 6:00:46 阅读更多 →

最新新闻

花卉识别课程设计:数据读取与划分全解析

花卉识别课程设计:数据读取与划分全解析

简介:一份数据挖掘与机器学习课程设计的花卉识别项目,面向高校计算机相关专业学生及机器学习入门者,用于完成花卉图像识别分类任务并理解完整的数据处理流程。压缩包共3个文件,包括2个Python脚本和1个gitignore配置文件&#xff0…

2026/10/10 7:13:15 阅读更多 →
Selenium元素定位实战:XPath、CSS Selector与滚动可见性全解

Selenium元素定位实战:XPath、CSS Selector与滚动可见性全解

做Selenium自动化测试这几年,我最大的体会是:元素定位搞不定,后面全是空谈。不管是写爬虫、做UI回归,还是搭自动巡检脚本,十个报错里九个都出在定位这一步——元素找不到、找错了、找到了却点不动,每一个都…

2026/10/10 7:13:15 阅读更多 →
PHP+MySQL图书管理系统源码部署与改造实战指南

PHP+MySQL图书管理系统源码部署与改造实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 7:13:15 阅读更多 →
辅助李亚普设计MPC:从安全池到兼容性约束的稳定性框架

辅助李亚普设计MPC:从安全池到兼容性约束的稳定性框架

MPC 叠上李亚普(Lyapunov)函数,在模型预测控制里是一对黄金搭档——但如果只是“用一个李亚普函数证明MPC稳定”,那这篇笔记就可以不写了。我手里这篇论文让我觉得有意思的点,恰恰在“辅助”这个词:先离线设…

2026/10/10 7:13:15 阅读更多 →
Codex CLI接入OpenAI兼容接口:config.toml逐行拆解与排错指南

Codex CLI接入OpenAI兼容接口:config.toml逐行拆解与排错指南

如果你手里有一份 Codex CLI,但出于种种原因想把它接到一个支持 OpenAI 协议的兼容接口上,这篇配置拆解应该能帮你省掉不少弯路。所谓“OpenAI 兼容接口”,指的是那些 API 请求路径、参数格式、返回结构与 OpenAI 官方接口保持一致的第三方服…

2026/10/10 7:13:15 阅读更多 →
NSGA-Ⅲ在梯级水电与火电联合多目标优化调度中的应用

NSGA-Ⅲ在梯级水电与火电联合多目标优化调度中的应用

梯级水电的来水天然具备时空耦合特性,上游电站的出库流量直接决定下游电站的发电水头与可调容量,火电机组则承担着电网基荷与快速调节的双重角色。把这两类电源放进同一个调度模型里,目标瞬间就不是单目标最小化煤耗那么简单了——既要让水电…

2026/10/10 7:12:15 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →