swift 如何使Firestore中的字典数据符合顺序?我想使用其中一个字段并将整数相加

piwo6bdm  于 2023-05-16  发布在  Swift
关注(0)|答案(2)|浏览(89)

我有一个来自云Firestore的数据的compactmap,但是我只需要访问其中一个变量并迭代它以添加存储在那里的整数。我的数据包含日期并且不符合序列,我正在努力寻找解决方案
我的数据:

struct Travel: Identifiable, Equatable, Codable {
    var id = UUID()
    var reason: String
    var date: Date
    var numDays: Int

Firestore获取:

func fetchData() async throws -> [Travel] {
        guard let uid = Auth.auth().currentUser?.uid else { return [] }
        let snapshot = try await reference1.document(uid).collection("dates")
            .order(by: "date", descending: true)
            .getDocuments()
        return snapshot.documents.compactMap { document in
            try! document.data(as: Travel.self)
        }
    }

我需要一种方法来访问numDays数据,并将所有保存的数据的所有值加在一起。
我已经尝试过for循环,但由于Travel不符合Sequence,因此无法执行此操作。
然后我有了viewModel:

@Published var travel: Loadable<[Travel]> = .loading
    
    
        func fetchPosts() {
                Task {
                    do {
                        travel = .loaded(try await datesRepository.fetchData())
                    } catch {
                        print("[ViewModel] Cannot fetch posts: \(error)")
                        travel = .error(error)
                    }
                }
            }

任何对该数据执行for循环的尝试都不起作用。请帮帮忙

ar7v8xwq

ar7v8xwq1#

如果我对问题的理解是正确的,你想得到一个Travel对象的数组,取出numDays的值,然后把它们加在一起?如果是这样,可以使用.reduce

let travelArray: [Travel] = ...
let totalDays = travelArray.reduce(0) { $0 + $1.numDays }

这意味着“获取数组并从0开始执行reduce,将每个Travel对象的numDays值添加到reduce中的运行总和并返回总和。

esbemjvw

esbemjvw2#

您可以创建一个函数,将其传入Travel对象的数组,并使用.reduce方法对天数求和,并根据需要返回它。就像这样:

func calculateTotalNumDays(travels: [Travel]) -> Int {
    let totalNumDays = travels.reduce(0) { (result, travel) in
        return result + travel.numDays
    }
    return totalNumDays
}

//Example
do {
    let fetchedTravels = try await datesRepository.fetchData()
    let totalNumDays = calculateTotalNumDays(travels: fetchedTravels)
    print("Total numDays: \(totalNumDays)")
} catch {
    print("Error fetching data: \(error)")
}

相关问题