2
@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)
    }
}
4

2 回答 2

2

您可以扩展Decodable协议并创建通用初始化程序:

extension Decodable {
    public init(data: Data, using decoder: JSONDecoder = JSONDecoder()) throws {
        self = try decoder.decode(Self.self, from: data)
    }
}
于 2021-01-07T17:33:47.487 回答
0

你不能覆盖类本身,但你可以初始化它,从 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
    }
}

如果你真的不需要一个类,最好使用 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)
    }
}
于 2021-01-07T16:08:00.673 回答