Swift 3的“Data”类型是否有类似于writeToFile的方法?

46

我有一些代码,可以返回新的 iOS 10 / Swift 3 NSData 替代类型:Data。

if let jpegData = UIImageJPEGRepresentation(newImage, 0.8) { ... }

我想将这个图像写入磁盘,但是NSData类没有writeToFile:方法。它确实有一个writeToURL:方法,但似乎无法与文件路径(和追加组件)一起使用。

有人能够澄清如何做到这一点吗?在Swift 2中曾经可以这样做:

jpegData.writeToFile(imagePath, atomically: true) 

谢谢!

1个回答

94

请使用write(to: fileURL)

例如:

let fileURL = try! FileManager.default
    .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    .appendingPathComponent("test.jpg")

do {
    try jpegData.write(to: fileURL, options: .atomic)
} catch {
    print(error)
}

或者,如果你真的被卡在一个 path 上,将其转换为一个 URL

do {
    try data.write(to: URL(fileURLWithPath: path), options: .atomic)
} catch {
    print(error)
}

但是,通常情况下,现在最好使用 URL 引用来代替路径字符串。


1
太棒了!谢谢Rob。还有感谢你转换到.atomic。 - Kyle G
2
苹果似乎正在向基于URL的文件API转移,并淘汰基于路径(String)的API。 - Nicolas Miari
大体上是这样,但有一些奇怪的例外(例如UIImage(contentsOfFile:),但没有文件URL版本)。 - Rob
如果文件路径(名称、文件夹)包含Unicode字符,则无法正常工作。 解决方案是: path.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlPathAllowed) - Iurie Manea
@IurieManea - 很好的观点。是的,如果您将路径或URL字符串传递给URL(string:)URL(fileURLWithPath:),则必须确保字符串已正确百分比转义。但是,如果您使用像let fileURL = baseURL.appendingPathComponent(".dat")这样的方法,它会为您执行百分比编码。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接