2017-07-18 1 views
1

So verwende ich Firebase, um JSON zu ziehen und es in ein Array von GasUse Objekte zu verwandeln.Schließung unerwartet erfordert werfen (Firebase)

Dies ist die GasUse Klasse. Sein Initialisierer akzeptiert eine Dictionary und gibt einen Fehler aus, wenn ein Schlüssel: Wert-Paar fehlt.

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)! 
    } 
} 

ich dann diesen Code verwenden zu schaffen scheint die GasUse versuchen

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) } 
     } 

    }) 

Aber die Funktion ein bestimmtes Format für die Schließung zu verlangen, dass ich denke, ich aber bin nach.

Ungültige Konvertierung von Funktion vom Typ werfen '(_) wirft ->()' zu nicht-Wurf Funktionstyp '(DataSnapshot) -> Void' (rootSnapshot) in

Was ist falsch hier?

Antwort

0

Compiler denkt, dass Ihr "try" -Block einen Fehler werfen könnte, der nicht durch zwei spezielle "catch" -Instruktionen erfasst wird. Aus Sicht des Compilers ist Ihre Schließung also ein Wermutstropfen. Um es zu beheben, fügen Sie einfach einen dritten Haken hinzu, der alles fängt:

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 
}