问题描述
@objcmembers
public class MyResponse: NSObject,Codable {
public let id: String?
public let context: String?
public let results: [MyResult]?
}
从类扩展中的数据解析 MyResponse 的正确方法是什么?
我尝试了以下操作,但出现错误“无法分配给值:‘self’是不可变的。 无法将“MyResponse”类型的值分配给“Self”类型。"
extension MyResponse {
public convenience 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)
}
}
,
您不能覆盖类本身,但是你可以初始化它,从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
}
}
如果你真的不需要一个类最好是结构,而不是使用它,它可以是这样的:
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)
}
}