提问人:ajeet sharma 提问时间:5/7/2021 更新时间:5/7/2021 访问量:108
从投掷函数转换无效。使用解码器类时
Invalid conversion from throwing function. When use decoder class
问:
我正在使用解码器类来解析 firebase firestore 的 json 响应。
这是我用于解析的扩展:
extension DocumentSnapshot {
func toObject<T: Decodable>() throws -> T {
let jsonData = try JSONSerialization.data(withJSONObject: data()!, options: [])
let object = try JSONDecoder().decode(T.self, from: jsonData)
return object
}
}
但是当我从文档ID列表中获取文档时。
然后我收到这个错误:
Invalid conversion from throwing function of type '(DocumentSnapshot?, Error?) throws -> Void' to non-throwing function type '(DocumentSnapshot?, Error?) -> Void'
这是我使用DocumentSnapshot扩展方法“toObject”的函数
plasmaRequestIDs.forEach { (document) in
Firestore.firestore().collection("plasma_request").document(document).addSnapshotListener { (documentSnapshot, error) in
guard let err = error else{return}
guard let snapshot = documentSnapshot else {return}
if snapshot.exists{
let requestobj:PlasmaRequest = try snapshot.toObject()
plasmaRequestList.append(requestobj)
if index == plasmaRequestIDs.count - 1 {
successHandler(plasmaRequestList)
}
}
}
index = index + 1
}
我收到此错误:
答:
2赞
matt
5/7/2021
#1
我只是要解释“无效转换”错误,因为这就是你所问的全部内容。术语有点令人困惑,但潜在的问题非常清楚。
你会承认,我想,你的是一个投掷函数?请注意以下单词:toObject
throws
func toObject<T: Decodable>() throws -> T {
因此,当你称呼它时,你正确地承认了这个事实,用以下方式称呼它:try
let requestobj:PlasmaRequest = try snapshot.toObject()
好吧,但 Swift 对你在哪里可以说非常严格;你只能在两个地方说:try
在结构中
do
do/catch
在函数中
throws
但你两者都不在!你在这个:
Firestore.firestore().collection("plasma_request")
.document(document)
.addSnapshotListener {
(documentSnapshot, error) in
闭合不抛出。因此,该选项将被删除。那么还剩下什么呢?您必须执行下列操作之一:.addSnapshotListener
将您的呼叫包装在
toObject
do
do/catch
使用代替
try?
try
使用代替
try!
try
我推荐第一个。
评论
FirebaseFirestoreSwift