Swift-如何在扩展便利初始化中将数据解析到类
从类扩展中的数据解析MyResponse的正确方法是什么 我尝试了以下操作,但出现错误“无法赋值:'self'是不可变的。 无法将“MyResponse”类型的值分配给“Self”类型。“Swift-如何在扩展便利初始化中将数据解析到类,swift,extension-methods,init,convenience-methods,Swift,Extension Methods,Init,Convenience Methods,从类扩展中的数据解析MyResponse的正确方法是什么 我尝试了以下操作,但出现错误“无法赋值:'self'是不可变的。 无法将“MyResponse”类型的值分配给“Self”类型。“ 您不能覆盖类本身,但您可以初始化它,从json初始化对象,然后赋值/如果使用您的代码,它将是这样的: extension MyResponse { public convenience init(data: Data) throws { self = try JSONDecoder()
您不能覆盖类本身,但您可以初始化它,从json初始化对象,然后赋值/如果使用您的代码,它将是这样的:
extension MyResponse {
public convenience init(data: Data) throws {
self = try JSONDecoder().decode(MyResponse.self, from: data)
}
}
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
}
}
如果您真的不需要类,最好使用struct而不是它,它可以是这样的:
extension MyResponse {
public convenience init(data: Data) throws {
self = try JSONDecoder().decode(MyResponse.self, from: data)
}
}
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)
}
}
如果您正在寻找这样的解决方案,但不想为每个
可解码的
类型提供一个新的初始值设定项,则可以创建一个只有您的类型符合的虚拟协议,然后扩展该虚拟协议。这是Swift标准库内部使用的解决方案。有关更多详细信息,请参阅我对的回答。