Swift-自定义解码器没有解码函数

问题描述

我创建了一个自定义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
}