Как использовать Codable протокол в классе модели данных цели c? - PullRequest
0 голосов
/ 31 мая 2018

Я работаю над смешиванием и сопоставлением исходного кода iOS.Я реализовал кодируемый для быстрого класса модели данных, который уменьшает бремя написания логики синтаксического анализатора.Я попытался согласовать мой целевой класс c с кодируемым протоколом, который, в свою очередь, выдал ошибку «Не удается найти объявление протокола для« Codable »».Есть ли способ использовать этот быстрый протокол в объективный класс с?Или есть ли какая-то другая цель c api, которая обеспечивает ту же возможность, что и Codable?Идея состоит в том, чтобы сделать логику синтаксического анализа одинаковой для быстрых и объективных классов C.

1 Ответ

0 голосов
/ 24 января 2019

Да, вы можете использовать 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")
    }
}
...