我有以下
struct
:
struct Recipe: Codable {
@DocumentID var id: String?
var vegetarian: Bool?
}
这就是我解析 Firestore 数据的方式:
do {
let decoder = JSONDecoder()
let recipeToDisplay = try decoder.decode(Recipe.self, from: data!)
let uuid = UUID().uuidString
FirestoreService.createRecipe(
documentId: uuid,
vegetarian: recipeToDisplay.vegetarian ?? false
) { recipeURL in
print("success")
}
} catch {
print("Error parsing response data: \(error)")
}
正在调用
catch
语句,我收到以下错误消息:decodingIsNotSupported("DocumentID values can only be decoded with Firestore.Decoder")
。
我研究过的所有文档都指出我使用
JSONDecoder()
来解析数据,但我在 Firestore.Decoder
上找不到任何内容。我应该有不同的方式来解析数据吗?
问题是我试图从没有
id
属性的源中解码 id
。从我的 id
中排除 CodingKeys
解决了问题。
struct Recipe: Codable {
@DocumentID var id: String?
var vegetarian: Bool?
private enum CodingKeys: String, CodingKey {
case id
case vegetarian
}
}
我的问题是我没有使用显式的可编码实现。不幸的是,您必须添加所有无意义的样板才能使其工作。而不是使用默认值。
所以继续让你的模型膨胀:
enum CodingKeys:字符串,CodingKey
init(来自解码器:解码器)
func 编码(到编码器:编码器)
Firebase 现在带有自己的解码器,您不再需要使用 JSON 解码器。您可以将文档引用传递给解码器来解析文档 ID。这样您就不需要 CodingKeys 来使其工作。
struct Recipe: Codable {
@DocumentID var id: String?
var vegetarian: Bool?
}
这就是你如何使用它
do {
let documentRef = Firestore.firestore().collection("recipes")
let decoder = Firestore.Decoder()
let recipeToDisplay = try decoder.decode(Recipe.self, from: data!)
} catch {
print("Error parsing response data: \(error)")
}