web-dev-qa-db-ja.com

Objective CデータモデルクラスでCodableプロトコルを使用する方法

私はiOSのソースコードのミックスとマッチに取り組んでいます。 Swiftデータモデルクラスにコード化可能コードを実装しました。これにより、パーサーロジックを作成する負担が軽減されます。コード化可能なプロトコルにObjective Cクラスを適合させようとすると、エラー「 'Codable' "。このSwiftプロトコルをObjective Cクラスに使用する方法はありますか?またはCodableと同じ機能を提供する他のObjective C APIはありますか?アイデアは、 SwiftおよびObjective Cクラス全体で同じ解析ロジック。

14
myCmyL

はい、Cojableを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")
    }
}
10
supc