【问题标题】:Swift 2.0: HTTP GET error handling in Xcode 7Swift 2.0:Xcode 7 中的 HTTP GET 错误处理
【发布时间】:2015-09-22 12:30:39
【问题描述】:

我是 xcode 编程的新手,我正在尝试在 Swift 2 中实现一个发出 HTTP Get 请求的应用程序。升级 xcode 7 后显示错误:

Cannot convert value of type 
'(NSData!, response: NSURLResponse!, err: NSError!) -> ()'
to expected argument type 
'(NSData?, NSURLResponse?, NSError?) -> Void'

(此代码 sn-p 使用 swift 1.2 的旧错误处理。)谁能帮我请教如何在 Swift 2.0 中实现这一点。

    request.HTTPMethod = "GET"
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request, completionHandler:loadedData)

    task.resume()


}

func loadedData(data:NSData!, response:NSURLResponse!, err:NSError!){

    if(err != nil)
    {
        print(err?.description)
    }
    else
    {
        var jsonResult: NSDictionary = NSDictionary()
        let httpResponse = response as! NSHTTPURLResponse
        print("\(httpResponse.statusCode)")

        if (httpResponse.statusCode == 200)
        {

            jsonResult = (try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary
            print(jsonResult)


            self.performSegueWithIdentifier("SuccessSignin", sender: self)

        }
        else if (httpResponse.statusCode == 422){

            print("422 Error Occured...")
        }


    }

}

【问题讨论】:

    标签: http get swift2 xcode7


    【解决方案1】:

    方法签名已更改(参数现在是可选的)。此外,您必须使用 try 包含在 do catch 块中。并避免使用强制尝试(使用!),但更喜欢捕捉可能的错误,并使用if let 安全地解开选项。示例:

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
        if error != nil {
            print(error!.description)
        } else {
            if let httpResponse = response as? NSHTTPURLResponse {
                if httpResponse.statusCode == 200 {
                    do {
                        if let data = data, let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
                            print(jsonResult)
                            self.performSegueWithIdentifier("SuccessSignin", sender: self)
                        }
                    } catch let JSONError as NSError {
                        print(JSONError)
                    }
                } else if (httpResponse.statusCode == 422) {
                    print("422 Error Occured...")
                }
            } else {
                print("Can't cast response to NSHTTPURLResponse")
            }
        }
    }
    
    task.resume()
    

    【讨论】:

      【解决方案2】:

      这是您收到的错误消息:

      Cannot convert value of type 
      '(NSData!, response: NSURLResponse!, err: NSError!) -> ()'
      to expected argument type 
      '(NSData?, NSURLResponse?, NSError?) -> Void'
      

      如消息中所示,dataTaskWithRequestcompletionHandler 的参数从强制解包 (!) 更改为可选 (?)。

      注意!?

      // old
      (NSData!, response: NSURLResponse!, err: NSError!)
      // new
      (NSData?, NSURLResponse?, NSError?)
      

      因此,您需要相应地调整您的代码。

      例如,您的方法声明将如下所示:

      func loadedData(data:NSData?, response:NSURLResponse?, err:NSError?)
      

      此外,评估方法主体并确保您现在正确解包可选参数dataresponseerr

      有关更多信息,请参阅NSURLSession 类参考。

      【讨论】:

        猜你喜欢
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 2015-11-15
        相关资源
        最近更新 更多