我正在阅读在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
}
}
})