使用 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)
    }
}