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

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...