Swift如何将Firestore返回的Map数据映射为自定义Object对象数组
实现方案
你只需要在原有查询逻辑的基础上增加类型转换和结构体组装逻辑即可,核心使用compactMap做安全转换避免运行时崩溃,完整实现如下:
// 你定义的结构体 struct Object { var key: String var value: [String] } // Firestore查询回调逻辑 query.getDocuments { snapshot, error in guard let documents = snapshot?.documents else { return } // 取出所有文档的全部键值对 let allKeyValuePairs = documents.flatMap({ $0.data() }) // 转换为目标结构体数组 let targetObjectArray = allKeyValuePairs.compactMap { key, value in // 安全转换value为[String]类型,类型不匹配的项会被自动过滤 guard let stringValueList = value as? [String] else { return nil } return Object(key: key, value: stringValueList) } // 此处targetObjectArray就是你需要的[Object]类型结果 print(targetObjectArray) }
如果你的需求是按文档拆分,每个Firestore文档对应一个独立的[Object]数组,可使用如下逻辑:
query.getDocuments { snapshot, error in guard let documents = snapshot?.documents else { return } // 得到[[Object]]类型结果,每个子数组对应一个文档的内容 let documentObjectList = documents.map { singleDocument in singleDocument.data().compactMap { key, value in guard let stringValueList = value as? [String] else { return nil } return Object(key: key, value: stringValueList) } } }
内容的提问来源于stack exchange,提问作者David Henry
相关产品推荐
相关产品推荐

