使用 Combine 如何遍历字典数组并设置 1 个额外的 属性?

With Combine how to iterate through an array of dictionaries and set 1 additional property?

a simple test project at Github 我正在下载 JSON 文件,将其解析为 [[String:Any]] 然后想将数据结构传递给 Core Data 的 NSBatchInsertRequest:

func fetchTopModels(language:String) {
    guard let url = urls[language] as? URL else { return }
    
    URLSession.shared.dataTaskPublisher(for: url)
        .tryMap(handleOutput)
        .tryMap { jsonData -> [[String: Any]] in
            let json = try? JSONSerialization.jsonObject(with: jsonData, options: [])
            guard let jsonDict = json as? [String:Any],
                  let dataList = jsonDict["data"] as? [[String:Any]]
                else { throw URLError(.badServerResponse) }
                return dataList
        }
        // TODO How to set language on each dataList member?
        //.map {
              //[=11=].language = language
        //}
        .sink { completion in
            print("fetchTopModels completion=\(completion)")
        } receiveValue: { fetchedTops in
            PersistenceController.shared.container.performBackgroundTask { backgroundContext in
                backgroundContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
                backgroundContext.automaticallyMergesChangesFromParent = true
                backgroundContext.perform {
                    
                    let batchInsert = NSBatchInsertRequest(entity: TopEntity.entity(), objects: fetchedTops)

但是 [[String:Any]] 数据结构在其每个成员上都缺少 language 字符串 属性。它在核心数据实体上是强制性的。

我的问题是如何遍历数组并在每个成员上设置 language(例如 "en" 的值)?

我已经搜索过了,但是很难找到好的指针,因为搜索关键字太常见了:-)

要更新字典,您需要为每个字典创建一个可变副本并插入语言以及数组本身的副本。像这样

.map { array in
    array.map { dict -> [String: Any] in
        var temp = dict
        temp["language"] = language
        return temp
    }
 }