Swift 4 enum кодируемый - PullRequest
       39

Swift 4 enum кодируемый

0 голосов
/ 09 октября 2018

Я анализирую данные JSON из API.Моя структура выглядит так:

struct ServiceUnit: Codable {
        let description,id: String?
        let group, groupDescription:String?
        let name: String?
        var value: MyValue?

        enum CodingKeys: String, CodingKey {
            case description = "Description"
            case group = "Group"
            case groupDescription = "GroupDescription"
            case id = "Id"
            case name = "Name"
            case value = "Value"
        }
    }

    enum MyValue: Codable {
        case string(String)
        case innerItem(InnerItem)

        init(from decoder: Decoder) throws {
            let container = try decoder.singleValueContainer()
            if let string = try? container.decode(String.self) {
                self = .string(string)
                return
            }
            if let innerItem = try? container.decode(InnerItem.self) {
                self = .innerItem(innerItem)
                return
            }
            throw DecodingError.typeMismatch(MyValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for MyValue"))
        }

        func encode(to encoder: Encoder) throws {
            var container = encoder.singleValueContainer()
            switch self {
            case .string(let x):
                try container.encode(x)
            case .innerItem(let x):
                try container.encode(x)
            }
        }
    }

    struct InnerItem: Codable {
        let type, id, name: String

        enum CodingKeys: String, CodingKey {
            case type = "__type"
            case id = "Id"
            case name = "Name"
        }
    }

, а данные json выглядят так:

    [
  {
  "Description": null,
  "Group": "Beskrivning av enheten",
  "GroupDescription": null,
  "Id": "Description",
  "Name": "Mer om enheten",
  "Value": "Det finns möjlighet till parkering på gatorna runt om, men det är kantstenar och ganska branta backar för att komma upp till lekplatsen.\r\n\r\nUtanför själva lekplatsen finns en gungställning med en plan omväg in. Alla lekredskap står i sandytor, det finns många kanter. Runt hela lekplatsen går ett staket med öppningar i olika riktningar."
  },
  {
  "Description": null,
  "Group": "Bilder och film",
  "GroupDescription": null,
  "Id": "Image",
  "Name": "Huvudbild",
  "Value": {
      "__type": "FileInfo",
      "Id": "8871b3b1-14f4-4054-8728-636d9da21ace",
      "Name": "ullerudsbacken.jpg"
  }
  }
  ]

Когда данные загружаются, я фильтрую их, чтобы получить только результат, где id = описаниеи я повторил значение значения следующим образом:

let su = serviceUnit.filter{$0.id == "ShortDescription"}
            let description = su[0].value

Затем моя проблема заключается в том, что я получаю эту ошибку из XCode, когда я хочу использовать значение для заполнения метки:

Невозможно присвоить значение типа MyValue? типу String?

Если я напечатаю su, я получу следующее:

[stockholmsParks. (Неизвестно)context в 0x105c3d098) .ServiceUnit (описание: nil, id: необязательный («ShortDescription»), group: необязательный («Beskrivning av enheten»), groupDescription: nil, name: необязательный («Introduktion»), значение: необязательный (stockholmsParks.(неизвестный контекст в 0x105c3d0e8) .MyValue.string ("Regnbågen på höjden. Den här lekplatsen ligger på ett högt berg i naturmark, всесторонне изучен в других областях. Более детально изучен вопрос о том, как можно научиться).ns en gungställning.Det finns också bänkbord i sol och grillplats. ")))]

Чего мне не хватает ???

1 Ответ

0 голосов
/ 09 октября 2018

Вам необходимо получить соответствующее значение из вашего перечисления.

let value = su[0].value
switch value {
    case .string(let description)?:
        yourLabel.text = description
    default:
        break
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...