Как разобрать несколько жестко закодированных ключей в структуре JSON API с протоколом Swift Decodable?

Boxo спросил: 12 мая 2018 в 05:10 в: json

Вопрос: Я пытаюсь декодировать мой JSON, который у некоторых JSON будет иметь случайную строку, а у некоторых будет жестко закодированная строка. Когда жестко закодированная строка является одной из приведенных ниже, я хотел бы отображать различные ячейки UICollectionView. У меня возникли проблемы с попыткой разобрать мой JSON, если это жестко закодированная строка и возможность отображать с ней другой UICollectionViewCell. Любая помощь в этом была бы замечательной. Это может быть новичок, но я попытался решить эту проблему на прошлой неделе, и у меня возникли проблемы с попыткой сделать это. Любая помощь по этому поводу будет высоко оценена.

**  Hardcoded Strings that could be one or the other:**
key: --> This string could be "breaking" or "normal" or "new"
item: --> This string could be "placement" or "slot" or "shared"
verb: --> This string could be "shared" or "posted"** NOT hardcoded strings, which the string comes in randomly**
heading: --> This string is a random string
type: --> This string is a random string

Вот некоторые из моих JSON, поэтому вы можете получить пример того, что я пытаюсь сделать:

    {
    slots: [
        {
        key: "breaking",
        item: "placement",
        heading: "Random String Text",
        type: "Random String Text",
        via: "Random",
        verb: "shared"
        sort_order: 0
        },
        {
        key: "breaking",
        item: "placement",
        heading: "Random String Text",
        type: "Random String Text",
        via: "Random",
        verb: "posted"
        sort_order: 1
        },
        {
        key: "event",
        item: "combine",
        heading: "Random String Text",
        type: "Random String Text",
        via: "Random",
        verb: "posted"
        sort_order: 2
        },
}

Это то, что у меня есть до сих пор для моей модели:

struct MyModel: Decodable {
    var key: String?
    var item: String?
    var heading: String?
    var type: String?
    var via: String?
    var verb: String?
}

Вот пример, который мне помог Дмитрий Серов.

pre>

Вот еще код, который мне помог Дмитрий Серов.

func collectionView(_ collectionView: UICollectionView,
 cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {   let model = ... // retrieve your model object here
   if model.verb == .shared {
     // Pass the pertinent identifier
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier:...)
     return cell
   else {
     ....
   }
 }

Проблема, когда я пытаюсь сделать это, просит меня ввести формат ниже которого я не уверен, как это сделать, и я пытаюсь разобрать еще несколько ключей.

struct MyModel { // Type names should use pascal case in Swift
  var verb: State?
  ....
  enum State {
    case shared
    case posted
  }
}// Decode your enums from strings
extension MyModel.State: Decodable {
  enum CodingKeys: String, CodingKey {
    case shared
    case posted
  }
}

1 ответ

Есть решение
Sergio Trejo ответил: 12 мая 2018 в 06:18

так я бы расшифровал ваш json, используя codable:

struct Response: Codable {
    var slots = [Slots]()
}struct Slots: Codable {
    var key: String?
    var item: String?
    var heading: String?
    var type: String?
    var via: String?
    var verb: String?
    var order: String?    enum CodingKeys: String, CodingKey {
        case order = "sort_order"
    }
    /** Custom Encoder to send null values**/
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)        try? container.encode(order, forKey: .order)
    }}

Для сравнения с жестко закодированными строками создайте перечисление:

enum key: String {
    case breking
    case normal
    case new
}

используйте его следующим образом:

if let response = try? JSONDecoder().decode(Response.self, from: response.data!){
for slot in response.slots{
    if slot.key == key.breaking.rawValue{
    //do something
    }
}
}
Boxo ответил: 12 мая 2018 в 05:35
Спасибо за это, но в этом коде не отображается ни одна из жестко закодированных строк или возможность показывать разные ячейки UIcollectioview на основе жестко закодированных строк, которые я изложил выше ...
Sergio Trejo ответил: 12 мая 2018 в 06:18
обновленный ответ,
Boxo ответил: 12 мая 2018 в 06:29
Благодаря! Я попробую. Как я могу создать расширение для этого? И где я могу поместить ключ "enum:", а if let response = try? ... "Где я могу поместить это в код?
Sergio Trejo ответил: 12 мая 2018 в 06:31
Я полагаю, вы получаете свой JSON с сервера, не так ли? ... на вашем ответе сервера помещался JSONDecoder, и из него вы можете передать его вам, диспетчеру просмотра, там, на вас, делегаты UIVIewCollection помещают сравнение if
Boxo ответил: 12 мая 2018 в 06:32
Мне нужно расширение для этого или код, который вы положили, хорошо? Я просто добавляю "if let response = try? ..." в контроллер UICollectionView?