2017-07-18 6 views
1

Firebaseを使用してJSONを取得し、GasUseオブジェクトの配列に変換します。Closureが予期せずthrow(Firebase)を要求する

これはGasUseクラスです。初期化子はDictionaryを受け入れ、キー:値のペアがないときにエラーをスローします。

class GasUse { 

    let distance: Double 
    let comment: String? 
    let addedByUser: String 
    let creationDate: Date 


    init(from jsonDict: [String:Any]) throws { 
     guard let distance = jsonDict["distance"] as? Double else { throw SerializationError.missing } 
     let comment = jsonDict["comment"] as? String 
     guard let addedByUser = jsonDict["addedByUser"] as? String else { throw SerializationError.missing } 
     guard let creationDateString = jsonDict["creationDate"] as? String else { throw SerializationError.missing } 

     self.distance = distance 
     self.comment = comment 
     self.addedByUser = addedByUser 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +zzzz" 
     self.creationDate = dateFormatter.date(from: creationDateString)! 
    } 
} 

私はその後GasUse

Database.database().reference().observeSingleEvent(of: .value, with: { //Invalid conversion from throwing function of type '(_) throws ->()' to non-throwing function type '(DataSnapshot) -> Void'(rootSnapshot) in 
    let childSnapshots = rootSnapshot.children.allObjects as! [DataSnapshot] 
    let childValues = childSnapshots.map { $0.value as! [String: Any] } 

    for value in childValues { 
     do { let gasUse = try GasUse(from: value) } 
     catch SerializationError.missing { self.present(self.makeAlert("Error", "Missing value in json"), animated: true, completion: nil) } 
     catch SerializationError.invalid { self.present(self.makeAlert("Error", "Invalid value in json"), animated: true, completion: nil) } 
     } 

    }) 

を試す作成するには、このコードを使用しますが、機能は、私は私も次のようだと思っていること、その閉鎖のための特定のフォーマットを要求するようです。種類の機能を投げるから

無効変換 '(_)はスロー - >()' 非投げ機能タイプ '(DataSnapshot) - >ボイド' に(rootSnapshot)

にあるものここで間違っている?

答えて

0

"try"ブロックは、2つの特定の "catch"命令ではキャプチャされないエラーが発生する可能性があると考えています。コンパイラの観点から見ると、クロージャは投げ捨てのものです。それを修正するには、すべてをキャッチする3番目のキャッチを追加してください:

do { let gasUse = try GasUse(from: value) } 
catch SerializationError.missing { self.present(self.makeAlert("Error", "Missing value in json"), animated: true, completion: nil) } 
catch SerializationError.invalid { self.present(self.makeAlert("Error", "Invalid value in json"), animated: true, completion: nil) } 
catch error { 
    // print() or assert() if you want to control such a case 
} 
関連する問題