1

我有样本A对象应该是Decodable

class A: Decodable {
    class B: Decodable {
        let value: Int
    }
    let name: Date
    let array: [B]
}

然后我有这个对象的ADecoder子类:Decoder

class ADecoder: Decoder {
    let data: [String: Any]
    // Keyed decoding
    public func container<Key>(keyedBy type: Key.Type) 
    throws -> KeyedDecodingContainer<Key> where Key: CodingKey {
        return KeyedDecodingContainer(AKeyedDecoding(data))
    }
    // ...
}

其中使用AKeyedDecoding键控解码容器:

class AKeyedDecoding<T: CodingKey> : KeyedDecodingContainerProtocol {
    typealias Key = T
    let data: [String: Any]

    func decode<T>(_ type: T.Type, forKey key: Key) 
    throws -> T where T: Decodable {
        if type == Date.self {
            // Parse date, for example
        }

        // Not called:
        if type == Array<Decodable>.self {
            // Decode array of `Decodable`s
        }
    }
   // Rest of protocol implementations...
}

解码过程:

let values = ["name": "Hello" as AnyObject,  "array": ["value": 2] as AnyObject]
let decoder = ADecoder(data: values)
do {
    try A(from: decoder)
} catch {
    print(error)
}

这适用于name具有自定义Date数据类型的字段。但我被困在解码B对象数组中。

有人知道如何实施它或从哪里获得更多信息?

  • 如何检查是否是T.types ?ArrayDecodable
  • 如何解码它们?
4

1 回答 1

1

对于数组,您需要提供unkeyedContainer()方法,该方法用于解码位置容器中的值。

func unkeyedContainer() throws -> UnkeyedDecodingContainer {
}

请注意,您还需要提供一个singleValueContainer()来解码叶子(最深的属性级别)。

func singleValueContainer() throws -> SingleValueDecodingContainer {
}
于 2018-03-06T18:49:45.327 回答