我正在阅读在Swift中解析REST API调用的不同方法,遇到了以下问题:

var url : String = "http://google.com?test=toto&test2=titi"
var request : NSMutableURLRequest = NSMutableURLRequest()
request.URL = NSURL(string: url)
request.HTTPMethod = "GET"

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in
    var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
    let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary

    if (jsonResult != nil) {
        // process jsonResult
    } else {
       // couldn't load JSON, look at error
    }


})


对我来说没有意义的一行是var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil。我们已经捕获了NSError参数并将其存储在名为error的变量中,现在我们覆盖它,并在闭包的第一行中将其设置为nil?或者,如果Swift以某种方式然后将错误从类型NSError!转换为AutoreleasingUnsafeMutablePointer<NSError?>,那么有人可以解释这种情况如何发生吗?

谢谢!

最佳答案

AutoreleasingUnsafeMutablePointer等同于Objective-C中的NSError **,它在方法中用作inout表达式。语法看起来很奇怪。

最可靠的方法是同时考虑两个错误并定义第二个错误变量。由于GET是NSURLRequest的默认HTTP方法,因此不可变的请求就足够了。

let url = "http://google.com?test=toto&test2=titi"
let request = NSURLRequest(URL:  NSURL(string: url)!)

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in

  if error != nil {
    // handle NSURLConnection error
  } else {
    var jsonError : NSError?
    if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: &jsonError) as? NSDictionary {
      // process jsonResult

    } else {
      // couldn't load JSON, look at jsonError
    }
  }
})

10-06 13:39
查看更多