Хочу сохранить данные в архивный JSON файл на диск, но UIImage не подписывается под Codable. Нашел на Stackoverflow хорошее решение, простое и короткое, вполне возможно кому-то еще пригодится, оно в конце кода. Encode с ним сделал, а вот Decode попытался реализовать, но не получается где и как сделать обратную конвертацию из Data в UIImage.
Подскажите, как это можно сделать?
import Foundation
import UIKit
class Bouquet: Codable {
var name: String
var image: SomeImage
init(name: String, image: SomeImage) {
self.name = name
self.image = image
}
// MARK: - Saving Data to Archive File===
// 1. Make a path to save and upload data.
static let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
static let archiveUrl = documentsDirectory.appendingPathComponent("carts").appendingPathExtension("plist")
// 2. Encoding and saving data.
static func saveToFile(carts: [Bouquet]) {
let propertyListEncoder = PropertyListEncoder()
let encodeCarts = try? propertyListEncoder.encode(carts)
try? encodeCarts?.write(to: archiveUrl, options: .noFileProtection)
}
// 3. Deconding and load data.
static func loadFromFile() -> [Bouquet] {
let propertyListDecoder = PropertyListDecoder()
// My code
var someImage = SomeImage(photo: ???)
UIImage(data: someImage.photo)!
var carts = [Bouquet]()
if let retrivedCartsData = try? Data(contentsOf: archiveUrl), let decodeCarts = try? propertyListDecoder.decode(Array<Bouquet>.self, from: retrivedCartsData) {
carts = decodeCarts
}
return carts
}
}
// Solution to Codable an UIImage
public struct SomeImage: Codable {
public let photo: Data
public init(photo: UIImage) {
self.photo = photo.pngData()!
}
}
//Deserialize:
UIImage(data: instanceOfSomeImage.photo)!