Вы можете использовать Codable
вместо NSKeyedArchiver
для преобразования моделей в данные и записи в файл. Предполагая, что ваша модель содержит только базовые c типы, все, что вам нужно сделать, это соответствовать протоколу Codable
.
struct Details : Identifiable, Codable {
...
}
Запись в файл:
extension Array where Element: Encodable {
func saveToFile(fileName: String) throws {
do {
let data = try JSONEncoder().encode(self)
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = dir.appendingPathComponent(fileName)
try data.write(to: fileURL)
} else {
//throw some error
}
} catch {
throw error
}
}
}
Сохраненный файл может Читайте так:
func readFile(fileName: String) throws {
do {
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let url = dir.appendingPathComponent(fileName)
let data = try Data(contentsOf: url)
let decoded = try JSONDecoder().decode([Details].self, from: data)
print("decoded: ", decoded)
} else {
//throw some error
}
} catch {
throw error
}
}
Если вы можете заменить UIImage
в вашей модели на Data
, то соответствие Codable
может быть достигнуто автоматически. Получите imageData из UIImage
, используя image.pngData()
.
struct MsgDetails: Codable {
var imageData: Data?
var text: String?
var date: Date?
var image: UIImage? {
if let data = imageData {
return UIImage(data: data)
}
return nil
}
}