Использование объекта с ream-кодированием - PullRequest
1 голос
/ 19 июня 2019

У меня есть приложение, в котором я пытался использовать UserDefaults для локального сохранения кодируемой модели , но проблема в том, что UserDefault не сохраняет все values модели и присваивает nil некоторым из них, а иногда назначается value.Поэтому я решил попробовать альтернативу realm , и я могу изменить свою модель для работы с realm , но у меня возникла проблема, которой нет в процесс из декодирования объекта в объекте с использованием области .Я смог заставить его работать, когда имел дело с Array объектом с List, но не array Объектами просто не удалось для сопоставления с JSON

ниже приведен пример массива, с которым я имею дело

{
    "id": 732,
    "name": "Vendor Name",
    "logo": ".../thumb/missing.png",
    "kitchens":
      {
        "id": 36,
        "name": "Sandwiches"
      }
  }

класс модели

class VendorsList : Object, Decodable {
    @objc dynamic var id : Int = 0
    @objc dynamic var name : String?
    @objc dynamic var logo : String?
    // Create your Realm List.
    var kitchensList = List<VendorKitchens>()

    override class func primaryKey() -> String? {
        return "id"
    }

    private enum CodingKeys: String, CodingKey {
        case id
        case name
        case logo
        // Set JSON Object Key
        case kitchensList = "kitchens"

    }

    public required convenience init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = try container.decode(Int.self, forKey: .id)
        self.name = try container.decode(String.self, forKey: .name)
        self.logo = try container.decode(String.self, forKey: .logo)
        // Map your JSON Array response
        let kitchens = try container.decodeIfPresent([VendorKitchens].self, forKey: .kitchensList) ?? [VendorKitchens()]
        kitchensList.append(objectsIn: kitchens)

    }

}


class VendorKitchens : Object, Decodable {
    @objc dynamic var id : Int = 0
    @objc dynamic var name : String?

    override class func primaryKey() -> String? {
        return "id"
    }

    private enum CodingKeys: String, CodingKey {
        case id
        case name
    }
}

эта returns ошибка

Не удалось сопоставить данные с JSON

1 Ответ

1 голос
/ 19 июня 2019

Вот, попробуйте это.

class VendorsList : Object, Decodable {
    @objc dynamic var id : Int = 0
    @objc dynamic var name : String?
    @objc dynamic var logo : String?
    @objc dynamic var kitchens: VendorKitchens? = nil

    override class func primaryKey() -> String? {
        return "id"
    }

    private enum CodingKeys: String, CodingKey {
        case id
        case name
        case logo
        case kitchens = "kitchens"

    }

    public required convenience init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = try container.decode(Int.self, forKey: .id)
        self.name = try container.decode(String.self, forKey: .name)
        self.logo = try container.decode(String.self, forKey: .logo)
        kitchens = try container.decodeIfPresent(VendorKitchens.self, forKey: .kitchensList)

    }

}


class VendorKitchens : Object, Decodable {
    @objc dynamic var id : Int = 0
    @objc dynamic var name : String?

    override class func primaryKey() -> String? {
        return "id"
    }

    private enum CodingKeys: String, CodingKey {
        case id
        case name
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...