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

Swift - custom Decoder has no decode() function

我创建了一个自定义 Decoder 来解码非常特定的数据格式,紧随 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的struct,在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() 函数。

所以,我的问题是,如果我添加这个功能,里面应该放些什么?

所以根据非常有用的意见,我修改了我的代码如下。首先我添加了一个顶层的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 协议的情况下工作(因此可以 运行 on < iOS 13):

//...

public func decode<T : Decodable>(_ type: T.Type, from data: Data) throws -> T {
   let decoder = _MyDecoder(input)
        
   return try! MyRecord(from: decoder) as! T
}    

现在我可以调用解码器如下:

let decoder = MyDecoder()
return try! decoder.decode(MyRecord.self, from: input)