【问题标题】:Unable to clear an error Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type无法清除错误从“(_, _, _) throws -> ()”类型的抛出函数到非抛出函数类型的无效转换
【发布时间】:2016-10-02 04:05:09
【问题描述】:

我收到标题中描述的错误。

从 '(_, _, _) throws -> ()' 类型的抛出函数到非抛出函数类型 '(NSData?, NSURLResponse?, NSError?) -> Void' 的无效转换

在会话 dataTaskWithRequest 之后。这是一个简单的用户注册到 PHP 和 mysql。在 Swift xcode 7.3 中。

 func displaymyalertmessage(userMessage:String)
    {
        var myAlert = UIAlertController(title: "Alert" , message:userMessage, preferredStyle: UIAlertControllerStyle.Alert); 
        let OkAction = UIAlertAction (title: "Ok", style: UIAlertActionStyle.Default, handler:nil);
        myAlert.addAction(OkAction);
        self.presentViewController(myAlert, animated:true, completion:nil);
    }

    // check for empty fields
    if(useremail!.isEmpty || username!.isEmpty ||
    userpassword!.isEmpty ||
        userrepeatpassword!.isEmpty){
        // Display alert message
            displaymyalertmessage("All fields are required");
        return; 
    }
        //Check if passwords match
        if(userpassword != userrepeatpassword)
        { 
            // display an alert message

            displaymyalertmessage("Passwords do not match");
            return;   
        } 
    // send data to server
    let myUrl = NSURL(string: "http://example/xxx.php")
    let request = NSMutableURLRequest(URL:myUrl!);
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST";

    let postString = "email=\(useremail)&password=\(userpassword)&username=\(username)"

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);

这是我收到错误的下一个任务(_,_,_)

    do {
    let task = session.dataTaskWithRequest(request)
    { (data, response, error) in          
        // if error          
        if error != nil {
            print("error=\(error)")
            return
        }          
        var err: NSError?
        var json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers, error: &err) as? NSDictionary

        if let parseJSON = json {

            var resultvalue = parseJSON["status"] as? String
            printld("result: \(resultvalue)")

        var isuserregistered:Bool = false;
        if(resultvalue=="Success") { isuserregistered = true; }

        var messagetodisplay:String = parseJSON["message"] as String!;
        if(!isuserregistered)
        {
            messagetodisplay = parseJSON["message"] as String!;

        }

    dispatch_async(dispatch_get_main_queue(), {

    // Display alert message with confirmation

    var myAlert = UIAlertController(title: "Alert" , message: "Registration is successful. Thank You", preferredStyle: UIAlertControllerStyle.Alert);

    let OkAction = UIAlertAction (title: "Ok", style: UIAlertActionStyle.Default){ ACTION in
        self.dismissViewControllerAnimated(true, completion: nil);
    }

    myAlert.addAction(OkAction);
    self.presentViewController(myAlert, animated:true, completion:nil)

    });

        }    }
    task.resume()
    }

我尝试了很多方法,但我无法清除此错误。

【问题讨论】:

  • 您应该使用try?try! 而不仅仅是trytry 传播错误,使整个闭包成为抛出闭包,在这种情况下是不允许的。

标签: php mysql xcode swift error-handling


【解决方案1】:

您需要将try-catch 移动到回调块范围内。此外,您不应通过引用将err 传递给JSONObjectWithData,因为它会引发错误。这应该有效:

let task = session.dataTaskWithRequest(request) { (data, response, error) in          
    // if error          
    if error != nil {
        print("error=\(error)")
        return
    }          

    var json: NSDictionary? = nil
    do {
       json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
    } catch {
        print("error=\(error)")
    }
    //...

【讨论】:

  • 我试过了,现在我得到一个无效的标识符 json
  • @Mro 我已经更新了答案。希望它能解决你的问题
猜你喜欢
  • 2017-11-19
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多