NSData init?(contentsOf url: URL) 从 Swift 2 迁移到 Swift 3

Posted

技术标签:

【中文标题】NSData init?(contentsOf url: URL) 从 Swift 2 迁移到 Swift 3【英文标题】:NSData init?(contentsOf url: URL) migration from Swift 2 to Swift 3 【发布时间】:2016-12-22 20:38:07 【问题描述】:

ios/Swift 新手。我正在尝试将一个项目(只是通过NSData init() 方法从 URL 获取内容)从 Swift 2 迁移到 Swift 3。原始代码如下所示:

let loadedImageData = NSData(contentsOfURL: imageURL)
            dispatch_async(dispatch_get_main_queue()) 
                if imageURL == user.profileImageURL 
                    if let imageData = loadedImageData  
                        self.profileImageView?.image = UIImage(data: imageData)
                    
                
            

Swift 3 迁移:

 let loadedImageData = NSData(contentsOf: imageURL as URL)
            DispatchQueue.main.async 
                if imageURL == user.profileImageURL 
                    if let imageData = loadedImageData  
                        self.profileImageView?.image = UIImage(data: imageData as Data)
                    
                
            

我不确定为什么我们需要将 NSData 返回值转换为 URL,然后在 Swift 3 中加载图像时再次将该返回值转换为 Data 类型。我们正在分配原始数据到两个版本中的变量loadedImageData。那为什么要选角呢? UIImage init() 方法似乎需要 Swift 3 中的数据对象。但是对于 Swift 2,没有相同的转换。这是为什么呢?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

迁移包括对这些方法签名的一些更改,即它们接受的类型。

在 Swift 2 中,NSData(contentsOfURL:)UIImage(data:) 分别采用 NSURLNSData

目前,它们已更改为NSData(contentsOf:)UIImage(data:),分别接受URLstruct)和Data(而不是NSData);因此,除非您从类型 URL 而不是 NSURL 构建 URL,否则强制转换是必要的。

您也可以使用 Data(contentsOf: URL) 来避免强制转换。

【讨论】:

啊,我明白了……URL 实际上是作为可选的 NSUrl 变量构建的……这确实很有意义。我们在哪里可以找到 swift 2.0 API 的文档和相应的更改。我指的是:developer.apple.com/reference/foundation/nsdata。但这并没有显示 init 方法从 2.0 到 3.0 的变化。谢谢!!

以上是关于NSData init?(contentsOf url: URL) 从 Swift 2 迁移到 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

问题在 swift iOS 中检索 json 数据

iOS 字典和NSData之间转换

contentsof:url加载截断URL的url内容

String(contentsOf: URL) 返回“没有这样的文件或目录”

NSArray怎么转换为NSData

在 Swift 3 中将 JSON 对象解析为 NSArray