使用 Swift 为可解码类型创建通用数据初始值设定项
Create a generic Data initializer for Decodable types using Swift
@objcMembers
public class MyResponse: NSObject, Codable {
public let id: String?
public let context: String?
public let results: [MyResult]?
}
从 class 扩展中的数据解析 MyResponse 的正确方法是什么?
我尝试了以下操作,但出现错误“无法分配给值:'self' 是不可变的。
无法将类型 'MyResponse' 的值分配给类型 'Self'。"
extension MyResponse {
public convenience init(data: Data) throws {
self = try JSONDecoder().decode(MyResponse.self, from: data)
}
}
你不能覆盖 class 本身,但你可以初始化它,从 json 初始化对象然后赋值/如果采用你的代码 - 它会是这样的:
public class MyResponse: Codable {
public var id: String?
public var context: String?
public var results: [MyResult]?
}
public extension MyResponse {
convenience init(data: Data) throws {
self.init()
let object = try JSONDecoder().decode(MyResponse.self, from: data)
self.id = object.id
self.context = object.context
self.results = object.results
}
}
如果你真的不需要 class 最好使用 struct 而不是它,它可以是这样的:
public struct MyResponse: Codable {
public let id: String?
public let context: String?
public let results: [String]?
}
public extension MyResponse {
init(data: Data) throws {
self = try JSONDecoder().decode(MyResponse.self, from: data)
}
}
您可以扩展 Decodable
协议并创建通用初始化程序:
extension Decodable {
public init(data: Data, using decoder: JSONDecoder = JSONDecoder()) throws {
self = try decoder.decode(Self.self, from: data)
}
}
@objcMembers
public class MyResponse: NSObject, Codable {
public let id: String?
public let context: String?
public let results: [MyResult]?
}
从 class 扩展中的数据解析 MyResponse 的正确方法是什么?
我尝试了以下操作,但出现错误“无法分配给值:'self' 是不可变的。 无法将类型 'MyResponse' 的值分配给类型 'Self'。"
extension MyResponse {
public convenience init(data: Data) throws {
self = try JSONDecoder().decode(MyResponse.self, from: data)
}
}
你不能覆盖 class 本身,但你可以初始化它,从 json 初始化对象然后赋值/如果采用你的代码 - 它会是这样的:
public class MyResponse: Codable {
public var id: String?
public var context: String?
public var results: [MyResult]?
}
public extension MyResponse {
convenience init(data: Data) throws {
self.init()
let object = try JSONDecoder().decode(MyResponse.self, from: data)
self.id = object.id
self.context = object.context
self.results = object.results
}
}
如果你真的不需要 class 最好使用 struct 而不是它,它可以是这样的:
public struct MyResponse: Codable {
public let id: String?
public let context: String?
public let results: [String]?
}
public extension MyResponse {
init(data: Data) throws {
self = try JSONDecoder().decode(MyResponse.self, from: data)
}
}
您可以扩展 Decodable
协议并创建通用初始化程序:
extension Decodable {
public init(data: Data, using decoder: JSONDecoder = JSONDecoder()) throws {
self = try decoder.decode(Self.self, from: data)
}
}