Firestore的documentReference.data(as:)方法不可用?求Swift类型映射替代方案
Firestore
data(as:) 方法调用问题解答 方法是否被弃用?
data(as:) 方法并未被弃用,它是Firestore为Swift提供的便捷解码扩展,但需要满足两个前提才能正常调用:
- 必须导入
FirebaseFirestoreSwift框架(仅导入FirebaseFirestore无法使用该扩展) - 你的自定义模型(比如示例中的
Occupant)需要遵循Codable协议
替代方案(若仍无法调用时)
如果确认满足前提但还是无法使用该方法,可以用以下两种方式实现文档到Swift类型的映射:
方式1:手动解析字段
func fetchOccupants() async throws -> [Occupant] { let snapshot = try await occupantsRef.getDocuments() return snapshot.documents.compactMap { document in let rawData = document.data() // 根据模型字段手动提取并转换数据 guard let name = rawData["name"] as? String, let age = rawData["age"] as? Int else { return nil } return Occupant(name: name, age: age) } }
方式2:使用Firestore.Decoder手动解码
func fetchOccupants() async throws -> [Occupant] { let snapshot = try await occupantsRef.getDocuments() let decoder = Firestore.Decoder() return try snapshot.documents.map { document in try decoder.decode(Occupant.self, from: document.data()) } }
额外排查点
- 检查
Podfile是否添加了FirebaseFirestoreSwift依赖,执行pod install后重启Xcode - 确认自定义模型的所有属性都符合
Codable要求(比如嵌套类型也需遵循Codable) - 修正代码中的类型拼写错误:示例中
data(as: Occupants.self)应为data(as: Occupant.self),需与返回值[Occupant]的类型一致 - 清理Xcode缓存(快捷键
Cmd+Shift+K)后重新编译项目
内容的提问来源于stack exchange,提问作者Katoari
相关产品推荐
相关产品推荐

