从投掷函数转换无效。使用解码器类时

Invalid conversion from throwing function. When use decoder class

提问人:ajeet sharma 提问时间:5/7/2021 更新时间:5/7/2021 访问量:108

问:

我正在使用解码器类来解析 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
    }

我收到此错误:

enter image description here

iOS Swift iPhone 异常 编译器错误

评论

0赞 jnpdx 5/7/2021
你有没有看过内置的自定义对象支持?firebase.google.com/docs/firestore/query-data/......FirebaseFirestoreSwift

答:

2赞 matt 5/7/2021 #1

我只是要解释“无效转换”错误,因为这就是你所问的全部内容。术语有点令人困惑,但潜在的问题非常清楚。

你会承认,我想,你的是一个投掷函数?请注意以下单词:toObjectthrows

func toObject<T: Decodable>() throws -> T {

因此,当你称呼它时,你正确地承认了这个事实,用以下方式称呼它:try

let requestobj:PlasmaRequest =  try snapshot.toObject()

好吧,但 Swift 对你在哪里可以说非常严格;你只能在两个地方说:try

  • 在结构中dodo/catch

  • 在函数中throws

但你两者都不在!你在这个:

Firestore.firestore().collection("plasma_request")
    .document(document)
        .addSnapshotListener { 
            (documentSnapshot, error) in

闭合不抛出。因此,该选项将被删除。那么还剩下什么呢?您必须执行下列操作之一:.addSnapshotListener

  • 将您的呼叫包装在toObjectdodo/catch

  • 使用代替try?try

  • 使用代替try!try

我推荐第一个。