问题描述
我创建了一个自定义Decoder
,该{@ 1}}遵循this tutorial来解码非常特定的数据格式。
请注意,我的数据格式不是XML或JSON。
我从开始:
public final class MyDecoder: Decoder {
public var codingPath: [CodingKey] = []
public var userInfo: [CodingUserInfoKey:Any] = [:]
public let input: String
public init(_ input: String) {
self.input = input
}
// all stubs are below
并添加了协议所需的所有存根。然后,在视频之后,我还添加了一个符合KeyedDecodingContainerProtocol
的结构,并在decode(_ type: String.Type,forKey key: Key)
中填写了所需的解析。
要获取信息,我这样做:
let decoder = MyDecoder(input)
let info = try! myRecord(from: decoder)
到目前为止效果很好。
下一步,我想看看是否有可能像对JSONDecoder
那样做:
let decoder = MyDecoder()
guard let info = try? decoder.decode(MyInfo.self,from: input) else {
fatalError("Failed to decode data")
}
但是当然不行,因为MyDecoder
没有decode()
函数。
解决方法
因此,基于非常有用的注释,我如下更改了代码。首先,我添加了一个顶级undefined
结构,并将原始解码器的名称更改为MyDecoder
。
_MyDecoder
或者,这也可以在不使用 现在我可以按以下方式调用解码器:public struct MyDecoder: TopLevelDecoder,Decodable {
public typealias Input = String
public init() {}
public func decode<T>(_ type: T.Type,from input: String) throws -> T where T : Decodable {
let decoder = _MyDecoder(input)
return try! MyRecord(from: decoder) as! T
}
}
协议的情况下工作(因此可以在TopLevelDecoder
//...
public func decode<T : Decodable>(_ type: T.Type,from data: Data) throws -> T {
let decoder = _MyDecoder(input)
return try! MyRecord(from: decoder) as! T
}