RealmSwift LinkingObjects и Decodable - PullRequest
       21

RealmSwift LinkingObjects и Decodable

0 голосов
/ 27 марта 2019

У меня есть класс модели Realm, который должен быть декодируемым, чтобы я мог сериализовать его из JSON и сохранить в базе данных.Каждый PortfolioItem связан с одним Product, и в какой-то момент мне нужно добраться до PortfolioItem из Product через обратную связь.Вот почему у меня есть свойство LinkingObjects.Проблема в том, что я пытаюсь соответствовать протоколу Decodable.Компилятор выдаёт мне ошибку Cannot automatically synthesize 'Decodable' because 'LinkingObjects<PortfolioItem>' does not conform to 'Decodable'.Как с этим бороться?Я нашел очень мало о LinkingObjects и Decodable онлайн и не знаю, как к этому подойти.

class PortfolioItem: Object {

    @objc dynamic var id: String = ""
    @objc dynamic var productId: String = ""

    @objc dynamic public var product: Product?

    convenience init(id: String, productId: String) {
        self.init()
        self.id = id
    }

}

final class Product: Object, Decodable {

    @objc dynamic var id: String = ""
    @objc dynamic var name: String = ""

    private let portfolioItems = LinkingObjects(fromType: PortfolioItem.self, property: "product")

    public var portfolioItem: PortfolioItem? {
        return portfolioItems.first
    }

    convenience init(id: String, name: String) {
        self.init()
        self.id = id
    }
}

Большое спасибо Крису Шоу за помощь в этом.Я написал более подробную статью о том, как настроить Decodable и LinkingObjects, посмотрите ЗДЕСЬ .

1 Ответ

3 голосов
/ 28 марта 2019

Ну, если я что-то упустил, то свойства LinkingObjects не нужно включать в декодирование.

Я предполагаю, что вы получаете JSON из какого-то онлайн-источника, где JSON для Product состоит из {id: "", name: ""}. До тех пор, пока вы правильно создаете PortfolioItem со связанным Product, полученное свойство LinkingObjects является результатом динамического запроса в Realm (и, следовательно, будет работать без какого-либо источника JSON).

Я не в состоянии проверить компиляцию ответа сегодня, но вы должны быть в состоянии использовать CodingKeys, чтобы просто исключить это свойство, то есть, добавив его в Product: -

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

Кроме того, не связано, но учтите, что ваша функция convenience init не инициализирует все передаваемые вами свойства.

...