web-dev-qa-db-fra.com

Comment utiliser le protocole codable dans la classe de modèle de données Objective C?

Je travaille sur le mélange et la correspondance du code source iOS. J'ai implémenté codable pour Swift qui réduit la charge de l'écriture de la logique de l'analyseur. J'ai essayé de conformer ma classe Objective C à un protocole codable qui, à son tour, a généré une erreur "Impossible de trouver la déclaration de protocole pour 'Codable' ". Existe-t-il un moyen d'utiliser ce protocole Swift dans la classe Objective C? Ou existe-t-il d'autres API Objective C qui offrent les mêmes capacités que Codable? L'idée est de logique d'analyse identique sur toutes les classes Swift et Objective C.

14
myCmyL

Oui, vous pouvez utiliser Codable avec Obj-C. La partie délicate est que, comme Obj-C ne peut pas voir Decoder, vous devrez donc créer une méthode de classe d'assistance lorsque vous aurez besoin qu'elle soit allouée du côté 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