Чтение и запись коллекции элементов класса в виде файла json - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь сохранить коллекцию элементов класса в файл 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 с некоторыми дополнительными расширениями для их библиотек? Все ответы в сети охватывают только один аспект этого подхода и, возможно, устарели из-за улучшений в библиотеках.

Есть подсказки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...