Я анализирую данные 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. ")))]
Чего мне не хватает ???