Я пытаюсь сохранить коллекцию элементов класса в файл json. Поэтому, когда я пишу это заново, я хочу сделать это как можно более совершенным, включая современные технологии и тип независимости (насколько это возможно).
Это мой (легкий) подход:
Сначала я использую цикл, чтобы скопировать все данные из элементов класса в структурный массив с именем «CacheSave». Затем я определил расширение моей структуры.
// MARK: - The protocol, when implemented by a structure makes the structure archive-able
protocol Dictionariable {
func dictionaryRepresentation() -> NSDictionary
init?(dictionaryRepresentation: NSDictionary?)
}
// MARK: - Implementation of the Dictionariable protocol by CacheSave struct
extension CacheSave: Dictionariable {
func dictionaryRepresentation() -> NSDictionary {
let representation: [String: AnyObject] = [
"fullpath": fullpath as AnyObject,
...
"labelColors": labelColors as AnyObject
]
return representation as NSDictionary
}
init?(dictionaryRepresentation: NSDictionary?) {
guard let values = dictionaryRepresentation else {return nil}
if let fullpath = values["fullpath"] as? String,
...
let labelColors = values["labelColors"] as? UInt16
{
self.fullpath = fullpath
...
self.labelColors = labelColors
} else {
return nil
}
}
}
// MARK: - Methods adding in archiving and unarchiving the structures
// Single Structure Instances
func extractStructureFromArchive<T: Dictionariable>() -> T? {
guard let encodedDict = NSKeyedUnarchiver.unarchiveObject(withFile: path()) as? NSDictionary else { return nil }
return T(dictionaryRepresentation: encodedDict)
}
func archiveStructure<T: Dictionariable>(structure: T) {
let encodedValue = structure.dictionaryRepresentation()
NSKeyedArchiver.archiveRootObject(encodedValue, toFile: path())
}
// Multiple Structure Instances
func extractStructuresFromArchive<T: Dictionariable>() -> [T] {
guard let encodedArray = NSKeyedUnarchiver.unarchiveObject(withFile: path()) as? [AnyObject] else { return [] }
return encodedArray.map{$0 as? NSDictionary}.compactMap{T(dictionaryRepresentation: $0)}
}
func archiveStructureInstances<T: Dictionariable>(structures: [T]) {
let encodedValues = structures.map{$0.dictionaryRepresentation()}
NSKeyedArchiver.archiveRootObject(encodedValues, toFile: path())
}
// ----- end saving -----
Я мог бы сохранить файл, это нормально. Но при попытке загрузить файл снова с
self.cacheData = extractStructuresFromArchive()
Я всегда получаю ноль. Есть идеи?
Эта реализация не использует формат json, я знаю. Поэтому в качестве следующего шага (когда он работает нормально) я хотел бы использовать json.
Мой вопрос: есть ли простой способ сделать все это, если учесть, что у нас уже есть Swift 4.2 с некоторыми дополнительными расширениями для их библиотек? Все ответы в сети охватывают только один аспект этого подхода и, возможно, устарели из-за улучшений в библиотеках.
Есть подсказки?