如何在 Swift 2 中使用 NSURLSession 的 dataTaskWithURL?

Posted

技术标签:

【中文标题】如何在 Swift 2 中使用 NSURLSession 的 dataTaskWithURL?【英文标题】:How to use NSURLSession's dataTaskWithURL with Swift 2? 【发布时间】:2015-06-19 06:30:41 【问题描述】:

在使用 Swift 1 时,这段代码运行良好:

        let connectionSession = NSURLSession.sharedSession()

        let task = connectionSession.dataTaskWithURL(currentURL!,  completionHandler:   (data, response , error) in
            ...

在 Swift 2 中,我收到以下编译器错误:

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

我该如何解决这个问题?

【问题讨论】:

Swift 1 中没有try,帽子代码怎么能正常工作? Ups,我正在从我的一个实验中复制...现在问题已解决。 task!.resume() 已用于 Swift 1 该代码片段在 Swift 2 中不会导致编译器错误。问题可能出在完成处理程序中。请展示一个(小)完整的独立示例来说明问题。 @MartinR 宾果游戏!我在 try/catch 内部遇到了问题。干杯! 【参考方案1】:

要在完成处理程序中使用NSJSONSerialization.JSONObjectWithData,您需要捕获错误:

    do 
        var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
        // Do Stuff
     catch 
        // handle error
    

【讨论】:

【参考方案2】:

你可以使用这样的可选值

 var task = session.dataTaskWithURL(url!) 
        (NSData?, NSURLResponse?, NSError?) throws -> Void

           do 
             var jsonData = try NSJSONSerialization.JSONObjectWithData(data!,options: .MutableContainers) as! NSArray

            catch 
          // handle error
           
 

 task!.resume()

【讨论】:

【参考方案3】:

正如@MartinR 指出的那样,事实证明问题不在于调用 NSURLSession 的 dataTaskWithURL,而在于完成处理程序的深处(更具体地说,是在 Swift 1 -> Swift 2 转换“尝试”期间添加的一个没有相应的捕获)。我看到其他人也有类似的问题(个人博客中的问题),并将向 Swift 人员提交增强请求以获得更好的错误描述。

【讨论】:

【参考方案4】:

在 Swift 2、XCode 7 中,Apple 在几个 API(不是全部)中将 NSError 替换为 ErrorType。

您可能在自己的代码中明确使用 NSError。用 Apple 使用 ErrorType 的 ErrorType 替换您自己的 NSError 用法。

【讨论】:

以上是关于如何在 Swift 2 中使用 NSURLSession 的 dataTaskWithURL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XCode 8 Playgrounds 中使用 Swift 2.3?

如何在 Swift 2 的 iOS 应用程序中使用音频?

如何在 swift 2.0 中使用 catch 概念

如何在 Swift 2.0 中获取错误消息?

如何在 Swift 2.0 中使用完成按钮做数字键盘?

如何在 Swift 中使用 Firestore 为 2 人多人游戏构建数据?