如何对Firestore获取的Travel数据中numDays字段值求和?
解决方案
核心问题
你遍历失败的原因是travel属性是Loadable<[Travel]>枚举类型,不是直接的数组,必须先判断枚举状态,取出内部的[Travel]集合后才能进行遍历求和。Travel结构体不需要遵循Sequence协议,因为我们要遍历的是数组而非单个Travel实例。
实现步骤
处理Loadable枚举状态
通过模式匹配取出.loaded状态下的旅行数组,再用reduce方法累加numDays(比手动for循环更简洁高效)。在ViewModel中添加计算属性
直接在ViewModel里定义一个计算属性,实时返回总天数:var totalTravelDays: Int { // 匹配loaded状态,取出数组;其他状态返回0(可根据需求调整,比如返回nil) guard case .loaded(let travels) = travel else { return 0 } // 累加所有travel的numDays return travels.reduce(0) { accumulated, travel in accumulated + travel.numDays } }或者用更简洁的尾随闭包写法:
var totalTravelDays: Int { guard case .loaded(let travels) = travel else { return 0 } return travels.reduce(0, { $0 + $1.numDays }) }可选:手动for循环实现
如果你更习惯for循环,也可以这样写:var totalTravelDays: Int { guard case .loaded(let travels) = travel else { return 0 } var total = 0 for travel in travels { total += travel.numDays } return total }
额外优化建议
- 你的Firestore解析代码里用了
try!,这会在解析失败时直接崩溃,建议改成try?,让compactMap自动过滤解析失败的文档:return snapshot.documents.compactMap { document in try? document.data(as: Travel.self) }
内容的提问来源于stack exchange,提问作者Mech
相关产品推荐
相关产品推荐

