From ffc71ae0e23de9803d45c0a3001d4d7582dccf5f Mon Sep 17 00:00:00 2001 From: panxi Date: Fri, 13 Dec 2019 13:41:25 -0500 Subject: [PATCH] update decodearray and encodearray method --- .../MVMCore/Models/Model/ModelRegistry.swift | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/MVMCore/MVMCore/Models/Model/ModelRegistry.swift b/MVMCore/MVMCore/Models/Model/ModelRegistry.swift index 75436fc..1bf2a89 100644 --- a/MVMCore/MVMCore/Models/Model/ModelRegistry.swift +++ b/MVMCore/MVMCore/Models/Model/ModelRegistry.swift @@ -104,8 +104,31 @@ extension KeyedDecodingContainer where Key: CodingKey { } public func decodeArray(codingKey: KeyedDecodingContainer.Key, typeCodingKey: C) throws -> [Model] { - guard let models: [Model] = try decodeArrayIfPresent(codingKey: codingKey, typeCodingKey: typeCodingKey) else { - return [Model]() + var unkeyedContainer: UnkeyedDecodingContainer? + do { + unkeyedContainer = try nestedUnkeyedContainer(forKey: codingKey) + } catch { + throw ModelRegistry.Error.decoderErrorObjectNotPresent + } + var otherUnkeyedContainer = try nestedUnkeyedContainer(forKey: codingKey) + var attributes = [Model.Type]() + while !unkeyedContainer!.isAtEnd { + let meta = try unkeyedContainer!.nestedContainer(keyedBy: C.self) + let type = try meta.decode(String.self, forKey: typeCodingKey) + //get the type + guard let found = ModelRegistry.types[type] else { + throw ModelRegistry.Error.decoderErrorModelNotMapped + } + attributes.append(found) + } + var i = 0 + var models = [Model]() + while !otherUnkeyedContainer.isAtEnd { + let foundModel = attributes[i] + if let model = try foundModel.mvmdecode(unkeyedContainer: &otherUnkeyedContainer) { + models.append(model) + } + i += 1 } return models } @@ -138,6 +161,10 @@ extension KeyedEncodingContainer where Key: CodingKey { public mutating func encodeArrayIfPresent(_ list:[Model]?, forKey key:KeyedEncodingContainer.Key) throws { guard let models = list else { return } - try self.encodeArray(models, forKey: key) + do { + try self.encodeArray(models, forKey: key) + } catch { + return + } } }