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