Swift-如何在扩展便利初始化中将数据解析到类

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()

从类扩展中的数据解析MyResponse的正确方法是什么

我尝试了以下操作,但出现错误“无法赋值:'self'是不可变的。 无法将“MyResponse”类型的值分配给“Self”类型。“


您不能覆盖类本身,但您可以初始化它,从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标准库内部使用的解决方案。有关更多详细信息,请参阅我对的回答。