为啥 Firestore 可编码支持不适用于此示例
Posted
技术标签:
【中文标题】为啥 Firestore 可编码支持不适用于此示例【英文标题】:Why does Firestore codable support not work for this example为什么 Firestore 可编码支持不适用于此示例 【发布时间】:2022-01-08 11:04:19 【问题描述】:在第一个示例中,它编译并正常工作,返回所有项目文档。
public struct Project: Codable, Identifiable, Equatable
@DocumentID public var id : String? = UUID().uuidString
public var name: String
public var password: String
public static func testQuery() async -> [Project]
let db = Firestore.firestore()
let ref = db.collection("Project")
let snapshot = try? await ref.getDocuments()
if let snapshot = snapshot
return snapshot.documents.compactMap document in
return try? document.data(as: Project.self)
else
return [Project]()
但是,如果我将 ref 更改为声明为 Query,则文档不再支持可编码。我该如何解决这个问题,因为我需要使用 Query 根据传递的参数动态构建查询。
public static func testQuery() async -> [Project]
let db = Firestore.firestore()
let ref: Query = db.collection("Project") // this line changed
let snapshot = try? await ref.getDocuments()
if let snapshot = snapshot
return snapshot.documents.compactMap document in
return try? document.data(as: Project.self). // this no longer compiles
else
return [Project]()
【问题讨论】:
查询人从何而来?项目?我从来没有听说过。 你检查过这个comprehensive guide吗? 是的,问题在于使用查询。我需要将 ref 声明为 Query 的原因是我需要基于输入以编程方式在.whereField
构造,而不是在编译时知道它们。查询成功构建并成功返回文档,但是,无论出于何种原因,这些文档都不可解码(似乎应该如此)。也许这是 Firestore Swift 支持中的一个错误
将let ref: Query = db.collection("Project")
更改为let ref: Query = db.collection("Project").whereField(addSomethingThatYouKnowWillReturnADocument)
会发生什么?那它有用吗?
不幸的是同样的问题
【参考方案1】:
事实证明,如果您将引用从 Query 转换为 CollectionReference,那么您可以使用内置的编码和解码功能。
public static func testQuery() async -> [Project]
let db = Firestore.firestore()
let ref: Query = db.collection("Project") // this line changed
let ref2 = ref as! CollectionReference
let snapshot = try? await ref2.getDocuments()
if let snapshot = snapshot
return snapshot.documents.compactMap document in
return try? document.data(as: Project.self). // this no longer compiles
else
return [Project]()
【讨论】:
以上是关于为啥 Firestore 可编码支持不适用于此示例的主要内容,如果未能解决你的问题,请参考以下文章
为啥 firebase_firestore 安全规则不适用于文档读取
为啥此代码不适用于 mcp3008? (来自 adafruit 官方网站)