内容提要
作者使用 SwiftUI 为 Apple Watch 开发南科校巴时刻表应用,采用 MVVM 架构。Model 硬编码工作日与节假日两条线路(欣园、科研楼)的发车时间,并计算当前时间前后的班次;ViewModel 通过计算属性转换数据并支持切换运行模式;View 使用 HStack、VStack 和 ScrollView 构建界面,显示上下班时间及两个操作按钮。项目代码已上传 GitHub。
延伸解读
MVVM 架构在 SwiftUI 中的实践
文章展示了如何将 MVVM 模式应用于 SwiftUI 项目。Model 负责硬编码校巴时刻表,ViewModel 通过计算属性将数据转换为 View 所需的格式,并处理用户意图如切换运行模式。View 则专注于界面构建。这种分离有助于代码维护和测试,尤其适合 SwiftUI 声明式 UI 的特点。
硬编码数据的权衡与局限
作者选择将校巴时刻表直接硬编码在代码中,以简化首个 SwiftUI 项目。这样做虽然快速上手,但缺乏灵活性,更新时刻表需重新编译应用。文章也提到未来可加入服务器订阅等功能,暗示了硬编码的局限性。对于简单工具或原型开发,这是一种合理的权衡。
watchOS 7 的界面适配与交互变化
文章提到 watchOS 7 取消了重压操作,因此将功能按钮隐藏在滚动视图下方。同时,SwiftUI 的 Label 组件在 watchOS 7 Beta 中显示效果不佳,作者改用 Text 替代。这反映了在新平台上开发时,需关注系统交互变化和组件兼容性,适时调整设计。
Swift 新语法与开发环境
作者使用了尚未正式发布的 Swift 多重尾闭包语法,并指出该语法将在同年 9 月后普及。这体现了 Swift 语言的持续演进,以及开发者对新技术的前瞻性应用。同时,文章基于 2020 年 WWDC 发布的 SwiftUI 第二版,展示了当时开发环境的特性。
Q&A
这个 Apple Watch 校巴时刻表应用是用什么架构开发的?
应用采用 MVVM 架构,即 Model、View、ViewModel。Model 负责封装校巴时刻表数据,ViewModel 将数据转换成 View 需要的格式并处理用户意图,View 使用 SwiftUI 构建界面。
应用如何获取当前时间前后的校巴班次?
Model 中硬编码了工作日和节假日两条线路(欣园、科研楼)的发车时间数组。通过 getBusSchedule 函数遍历时刻表,比较当前时间,返回上一班和下一班的发车时间。
应用如何切换工作日和节假日的运行模式?
ViewModel 中有一个 isOnWeekDay 计算属性,默认根据当前日期是否为周末自动判断。用户点击“变更运行模式”按钮时,调用 swichModel() 方法切换该属性,从而改变时刻表。
应用的界面是如何构建的?
界面使用 SwiftUI 的 HStack、VStack 和 ScrollView 构建。主体部分用 BusTableView 显示方向、上一班和下一班时间,并配有 SF Symbol 图标。下方有“更新时间”和“变更运行模式”两个按钮。
为什么应用选择硬编码校巴时刻表而不是使用数据管理?
因为这是第一个 SwiftUI 上手项目,为了简化,没有使用 File System、Core Data 或 UserDefault 等数据管理方式,而是直接将所有运行时刻硬编码到代码中。
应用未来可以扩展哪些功能?
未来可以加入多条线路选择、向服务器订阅校巴时刻表、假期安排等功能。