2016-07-14 25 views
27

Ich habe einige Code, der die neue iOS 10/Swift 3 NSData Ersatz liefert ein (?): DatenGibt es eine WriteToFile-Entsprechung für den Typ "Data" von Swift 3?

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

ich dieses Bild auf die Festplatte schreiben möchten, aber writeToFile: Methode des NSData für diese Klasse nicht vorhanden ist, . Es hat eine writeToURL: Methode, aber das scheint nicht mit einem Dateipfad (und anhängende Komponente) zu arbeiten.

Kann jemand klären, wie ich das jetzt tun würde, den Fall in Swift zu 2 als gebraucht:

jpegData.writeToFile(imagePath, atomically: true) 

Dank!

Antwort

68

Verwenden Sie write(to: fileURL).

Zum Beispiel:

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

Oder, wenn Sie wirklich mit einem path stecken, konvertieren, das zu einem URL:

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

Aber im Allgemeinen ist es vorzuziehen, URL Referenzen zu verwenden in Ihrem Code heutzutage, die Verwendung von Pfadzeichenfolgen zurückzuziehen.

+1

Das ist fantastisch! Danke, Rob. Und danke, dass Sie auf Atomic umgestellt haben. –

+2

Apple scheint sich URL-basierten Datei-APIs zuzuwenden und die (string) -basierten Pfadnamen abzulehnen. –

+0

Weitgehend so, ja, aber mit einigen seltsamen Ausnahmen (zB ['UIImage (contentsOfFile:)'] (https://developer.apple.com/documentation/uikit/uiimage/1624112-init), aber keine Datei-URL-Wiedergabe) . – Rob