2016-07-14 6 views
27

Я некоторый код, который возвращает новый IOS 10/замену Swift 3 NSData типа (?): ДанныеЕсть ли эквивалент writeToFile для типа данных «Swift 3»?

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

Я хочу написать этот образ на диск, однако метод NSData в writeToFile: нет для этого класса , Он имеет метод writeToURL:, но, похоже, он не работает с файловым контуром (и добавляющим компонентом).

Может кто-нибудь прояснить, как я бы сейчас сделать это, как раньше случай Swift 2:

jpegData.writeToFile(imagePath, atomically: true) 

Спасибо!

ответ

68

Использование 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

Это фантастика! Спасибо, Роб. И спасибо за переход на .atomic. –

+2

Apple, похоже, движется к API-интерфейсам файлов на основе URL-адресов и обесценивает (?) Путь (на основе String). –

+0

Во многом так, да, но с некоторыми нечетными исключениями (например, '' UIImage (contentsOfFile:) '] (https://developer.apple.com/documentation/uikit/uiimage/1624112-init), но без изменения URL-адреса файла) , – Rob