【问题标题】:What is the point of a nil AutoreleasingUnsafeMutablePointer in a Swift closure?Swift 闭包中的 nil AutoreleasingUnsafeMutablePointer 有什么意义?
【发布时间】:2015-06-28 06:20:38
【问题描述】:

我正在阅读在 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&lt;NSError?&gt; = nil。我们已经捕获了我们的NSError 参数并将其存储在一个名为error 的变量中,现在我们要覆盖它并在闭包的第一行中使其为零?或者,如果 Swift 以某种方式将错误从 NSError! 类型向下转换为 AutoreleasingUnsafeMutablePointer&lt;NSError?&gt;,那么有人可以解释这是怎么发生的吗?

谢谢!

【问题讨论】:

    标签: ios objective-c xcode swift closures


    【解决方案1】:

    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
        }
      }
    })
    

    【讨论】:

    • 太棒了,谢谢!那么将 AutoreleasingUnsafeMutablePointer 设置为 nil 有什么意义呢?
    • 这是为了重用连接请求返回的错误指针
    • 为什么我们不只是创建另一个变量来做到这一点?在我的问题的代码中,我们甚至在检查是否存储了错误之前直接进入 JSON 序列化。
    • 是的,这很容易出错。这就是我在解决方案中更改它的原因
    • 啊,明白了。谢谢@vadian!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2018-08-12
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2014-08-05
    相关资源
    最近更新 更多