Swift - Соединение содержательных данных через несколько классов - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь получить свои данные из Contentful в моем приложении Swift, но застрял при получении dictionary.

ОБНОВЛЕНИЕ : тип - Link & linkType - Entry. Поэтому мне нужно декодировать ссылку на запись.

Итак, в моих содержательных данных для Item A у меня есть:

        "itemB": {
          "sys": {
            "type": "Link",
            "linkType": "Entry",
            "id": "id_is_here"
          }
        },

Но в моем коде мой itemB равен nil .

Вот что я пробовал:

// Item A
class ItemA: EntryDecodable, FieldKeysQueryable {

    static let contentTypeId: String = "ItemA"

    // FlatResource Memberes.
    let id: String
    var updatedAt: Date?
    var createdAt: Date?
    var localeCode: String?

    var itemB: ItemB?

    public required init(from decoder: Decoder) throws {

        let sys          = try decoder.sys()
        id               = sys.id
        localeCode       = sys.locale
        updatedAt        = sys.updatedAt
        createdAt        = sys.createdAt

        let fields       = try decoder.contentfulFieldsContainer(keyedBy: FieldKeys.self)

        try fields.resolveLink(forKey: .itemB, decoder: decoder) { [weak self] item in
            self?.itemB = item as? ItemB
        }
    }

    enum FieldKeys: String, CodingKey {

        case itemB
    }

    public init(sys: Sys, itemB: ItemB?) {

        id               = sys.id
        localeCode       = sys.locale
        updatedAt        = sys.updatedAt
        createdAt        = sys.createdAt
        self.itemB       = itemB
    }
}

// Item B
class ItemB: EntryDecodable, FieldKeysQueryable {

    static let contentTypeId: String = "ItemB"

    // FlatResource Memberes.
    let id: String
    var updatedAt: Date?
    var createdAt: Date?
    var localeCode: String?

    let name: String?

    public required init(from decoder: Decoder) throws {

        let sys          = try decoder.sys()
        id               = sys.id
        localeCode       = sys.locale
        updatedAt        = sys.updatedAt
        createdAt        = sys.createdAt

        let fields       = try decoder.contentfulFieldsContainer(keyedBy: FieldKeys.self)

        self.name        = try fields.decode(String.self, forKey: .name)
    }

    enum FieldKeys: String, CodingKey {

        case name
    }

    public init(sys: Sys, name: String) {

        id          = sys.id
        localeCode  = sys.locale
        updatedAt   = sys.updatedAt
        createdAt   = sys.createdAt
        self.name   = name
    } 
}
...