You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Firestore获取的Travel数据中numDays字段值求和?

解决方案

核心问题

你遍历失败的原因是travel属性是Loadable<[Travel]>枚举类型,不是直接的数组,必须先判断枚举状态,取出内部的[Travel]集合后才能进行遍历求和。Travel结构体不需要遵循Sequence协议,因为我们要遍历的是数组而非单个Travel实例。

实现步骤

  1. 处理Loadable枚举状态
    通过模式匹配取出.loaded状态下的旅行数组,再用reduce方法累加numDays(比手动for循环更简洁高效)。

  2. 在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 })
    }
    
  3. 可选:手动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:50:14