Ich versuche, eine throws
zu meiner bestehenden Funktion mit einem Abschluss-Handler hinzufügen, aber ich bekomme immer eine Warnung sagen no calls throwing functions occur within try expression
. In dem Abschnitt, wo ich die Fehler werfen, bekomme ich einen Fehler mit einem Körnchen Salz zu sagenKann keine Würfe zur Arbeit mit Funktion mit Abschlussbehandler
invalid conversion from throwing function of type '() throwing -> Void' to non-throwing function type.
enum LoginError: ErrorType {
case Invalid_Credentials
case Unable_To_Access_Login
case User_Not_Found
}
@IBAction func loginPressed(sender: AnyObject) {
do{
try self.login3(dict, completion: { (result) -> Void in
if (result == true)
{
self.performSegueWithIdentifier("loginSegue", sender: nil)
}
})
}
catch LoginError.User_Not_Found
{
//deal with it
}
catch LoginError.Unable_To_Access_Login
{
//deal with it
}
catch LoginError.Invalid_Credentials
{
//deal with it
}
catch
{
print("i dunno")
}
}
func login3(params:[String: String], completion: (result:Bool) throws -> Void)
{
//Request set up
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSDictionary
if let parseJSON = json
{
let userID = parseJSON["user_id"] as? Int
let loginError = parseJSON["user_not_found"] as? String
let validationError = parseJSON["invalid_credentials"] as? String
let exception = parseJSON["unable_to_access_login"] as? String
var responseArray = [(parseJSON["user_id"] as? Int)]
if userID != nil
{
dispatch_async(dispatch_get_main_queue()) {
completion(result:true)
}
}
else if loginError != ""
{
dispatch_async(dispatch_get_main_queue()){
completion(result: false)
self.loginErrorLabel.text = loginError
throw LoginError.User_Not_Found
}
}
else if validationError != ""
{
dispatch_async(dispatch_get_main_queue()){
completion(result:false)
self.validationErrorLabel.text = validationError
throw LoginError.Invalid_Credentials
}
}
else if exception != nil
{
dispatch_async(dispatch_get_main_queue()){
completion(result:false)
self.exceptionErrorLabel.text = "Unable to login"
throw LoginError.Unable_To_Access_Login
}
}
}
else
{
}
}
catch let parseError {
// Log the error thrown by `JSONObjectWithData`
})
task.resume()
}
Das ist eine asynchrone Funktion. In Ihrem Callback müssen Sie einen Fehler zurückgeben, nicht werfen, bis Sie Ihr Programm geworfen haben, ist bereits von dieser Funktion zurückgekehrt, daher funktioniert es nicht. – sbarow
Ich bin ein bisschen verwirrt. Soll der Callback ausgelöst werden oder soll die Funktion, die den Callback enthält, geworfen werden? Ich warte auf die Antwort vom Server, um festzustellen, welche Art von Fehler zu werfen, die mich denken, dass der Callback werfen muss. – Brosef
@Victor Sigler Antwort ist, was Sie suchen. – sbarow