内容提要
作者用SwiftUI为Apple Watch开发了查询南科大校巴发车时间的应用,采用MVVM架构:Model硬编码工作日与节假日两条线路时刻表,用Time类比较时间;ViewModel通过计算属性输出前后班次并支持切换运营模式;View用HStack、VStack和ScrollView搭建界面,显示两条线路信息及更新、切换按钮。代码已上传GitHub,作为SwiftUI入门练习。
延伸解读
MVVM 架构在 SwiftUI 中的实践
文章以校巴时刻表应用为例,展示了 SwiftUI 推荐的 MVVM 模式。Model 层硬编码了工作日和节假日的两条线路时刻表,并用 Time 类比较时间;ViewModel 通过计算属性输出前后班次,并处理运营模式切换;View 层用 HStack、VStack 和 ScrollView 构建界面。这种分层让代码更清晰,也便于测试,体现了 SwiftUI 与 UIKit 在架构思路上的差异。
watchOS 7.0 的界面适配细节
作者在开发中注意到 watchOS 7.0 取消了 Force Touch,因此将功能按钮隐藏在界面下方,通过滚动查看。同时,SwiftUI 的 Label 在 watchOS 7.0 Beta 中显示效果不佳,图标与文字无法对齐,于是改用 Text 实现按钮。这些细节提醒开发者,在 watchOS 上使用 SwiftUI 时需关注系统版本的特性和限制,灵活调整 UI 实现。
数据硬编码与可扩展性
当前应用将时刻表直接硬编码在代码中,未使用文件系统、Core Data 或 UserDefault 等数据管理方式。这样做简化了入门项目,但更新时刻表需修改代码并重新发布。作者提到未来可添加多路线选择、从服务器订阅时刻表、节假日安排等功能。这为读者提供了从简单原型到实用应用的演进思路,也点明了硬编码方案的局限性。
Q&A
为什么作者要开发这个Apple Watch校车时刻表应用?
因为南科大校园巴士发车时间查询不便,作者便开发了一个Apple Watch应用来查询最新的发车时间,同时作为Swift和SwiftUI的入门练习项目。
这个应用采用了什么架构?各层分别负责什么?
采用MVVM架构。Model层硬编码了工作日和节假日两条线路的时刻表,并用Time类比较时间;ViewModel层通过计算属性输出前后班次,并支持切换运营模式;View层用HStack、VStack和ScrollView搭建界面,显示两条线路信息及更新、切换按钮。
应用如何展示两条校巴线路的信息?
应用分别显示上坡路线(目的地:欣园)和下坡路线(目的地:科研楼)的运营状态,每条线路显示前一班和下一班发车时间,并配有SF Symbol图标(上箭头和下箭头)。
应用如何切换工作日和节假日时刻表?
ViewModel中有一个isOnWeekDay属性,默认根据当前日期是否为周末自动判断,用户也可以通过“切换运营模式”按钮手动切换,切换后界面会显示当前使用的时刻表类型。
Model层如何计算当前时间的前后班次?
Model层硬编码了四条时刻表数组(工作日和节假日的欣园、科研楼线路),通过getBusSchedule函数遍历时刻表,用Time类比较时间,找出小于等于当前时间的最后一班作为前一班,大于当前时间的第一班作为下一班。
这个应用未来可以扩展哪些功能?
未来可以添加多路线选择、从服务器订阅巴士时刻表、节假日安排等功能。