内容提要
作者因疫情取消交换项目,遂提前用SwiftUI开发了一款Apple Watch校巴查询应用。文章先介绍项目背景与MVVM架构,再分三部分讲解:Model层硬编码时刻表并通过时间比较获取前后班次;ViewModel层以计算属性输出视图所需数据,支持工作日与假日切换;View层用SwiftUI的HStack、VStack、ScrollView和Button搭建界面。项目较为简单,代码已开源,未来可扩展多路线与服务器订阅功能。
延伸解读
MVVM 架构在简单项目中的实践意义
作者虽然开发的是功能简单的校巴查询应用,但仍选择 MVVM 而非将代码堆在一个文件里。Model 层封装时刻表数据,ViewModel 层通过计算属性将数据转换为视图所需格式,View 层只负责界面展示。这种分层让代码更易测试和维护,也体现了 SwiftUI 不推崇传统 MVC 的设计理念。对于初学者,即使项目小,遵循架构规范也是值得养成的习惯。
硬编码时刻表的取舍与局限
文章将校巴时刻表直接硬编码在代码中,包括工作日和假日两套数据。这样做省去了文件系统或数据库的复杂度,适合入门练习。但硬编码意味着每次时刻表调整都需要重新编译发布应用,无法动态更新。作者也提到未来可扩展服务器订阅功能,这正说明当前方案在灵活性上的不足。读者需注意,此做法仅适用于数据稳定且变更不频繁的场景。
watchOS 交互限制下的界面适配
作者在开发中遇到 watchOS 7.0 取消 Force Touch 以及 SwiftUI Label 组件显示异常的问题,最终改用 Text 包裹 Button 并隐藏功能按钮。这反映出在 watchOS 上开发需关注系统版本特性与组件兼容性。ScrollView 的采用则直接获得了数码表冠旋转和振动反馈等原生交互。对于想尝试 watchOS 开发的读者,提前了解这些平台限制能减少调试成本。
Q&A
为什么作者要开发这款 Apple Watch 校巴查询应用?
作者因疫情取消了原定在新加坡国立大学的暑期交换项目,于是提前开始了 SwiftUI 探索。同时,由于在南科大查询校巴发车时间不方便,便开发了这款 Apple Watch 应用来查询南科大校巴的最新发车时间。
这个校巴应用采用了什么架构?各层分别负责什么?
应用采用 MVVM 架构。Model 层封装校巴时刻表数据,硬编码在代码中;ViewModel 层将 Model 数据转换为视图所需的形式,并处理用户意图(如切换工作日/假日模式);View 层使用 SwiftUI 构建界面。
应用如何获取当前时间前后的班次信息?
Model 层硬编码了各路线的工作日和假日时刻表。通过遍历时刻表,将每个时间字符串转换为 Date 后与当前时间比较,找到小于等于当前时间的最近班次作为前一班,大于当前时间的最近班次作为下一班。
应用如何实现工作日和假日时刻表的切换?
ViewModel 中有一个 isOnWeekDay 计算属性,默认根据当前日期是否为周末自动判断。用户点击“切换运行模式”按钮时,调用 swichModel() 方法切换该属性,从而在两种时刻表之间切换。
界面是如何用 SwiftUI 构建的?主要使用了哪些组件?
界面使用 SwiftUI 的 HStack、VStack 进行布局,用 ScrollView 包裹以支持数码表冠滚动,用 Button 实现“更新时间”和“切换运行模式”按钮,并用 Text 显示文本信息,同时使用 SF Symbol 图标。
这个应用未来可以扩展哪些功能?
未来可以增加多路线选择、从服务器订阅校巴时刻表、假日安排等功能。作者也表示希望南科大开通更多校巴路线,以便为下一篇博客准备内容。