如何在Objective c数据模型类中使用Codable协议?

时间:2018-05-31 05:55:23

标签: objective-c swift codable

我正在研究混合搭配iOS源代码。我已经为swift数据模型类实现了codable,这减少了编写解析器逻辑的负担。我试图使我的目标c类符合可编码的protcol,这反过来又抛出错误“找不到'Codable'的协议声明”。有没有办法将这个swift协议用于客观c类?或者是否有任何其他目标c api提供与Codable相同的功能?我们的想法是在快速和客观的c类中使解析逻辑相同。

2 个答案:

答案 0 :(得分:2)

是的,您可以将Codable与Obj-C一起使用。棘手的部分是,因为Obj-C无法看到Decoder,所以当您需要从Obj-C端分配该方法时,需要创建一个辅助类方法。

public class MyCodableItem: NSObject, Codable {
    private let id: String
    private let label: String?

    enum CodingKeys: String, CodingKey {
        case id
        case label
    }

    @objc public class func create(from url: URL) -> MyCodableItem {
        let decoder = JSONDecoder()
        let item = try! decoder.decode(MyCodableItem.self, from: try! Data(contentsOf: url))
        return item
    }

    public required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(String.self, forKey: .id)
        label = try? container.decode(String.self, forKey: .label)
        super.init()
    }

    required init(coder decoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

答案 1 :(得分:1)

class LoginDataModel: NSObject ,Codable {
 @objc var stepCompleted: String?
 @objc var userID: Int?
 @objc var authkey: String?
 @objc var type, status: String?


 enum CodingKeys: String, CodingKey {
    case stepCompleted = "step_completed"
    case userID = "user_id"
    case authkey
    case type, status
  }
}