gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:05:25 24 4
gpt4 key购买 nike

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

并添加了协议(protocol)所需的所有 stub 。然后跟着视频我也添加了一个符合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 协议(protocol)的情况下工作(因此可以在

//...

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)

关于Swift - 自定义解码器没有 decode() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63459117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com