Я хотел бы получить значения из ключей с именем «termKey» из всех словарей в массиве словарей (поскольку я хочу отображать значения в UITableView). Какие-либо предложения?
Вот массив словарей:
{
"questionData": [
{
"termKey": "respiration"
},
{
"termKey": "mammals"
}
]
}
Это сглаженный массив:
[(key: "termKey", value: "respiration"), (key: "termKey", value: "mammals")]
Результат, который я хочу, будет примерно таким: ["respiration", "mammals"]
let array = [(key: "termKey", value: "respiration"), (key: "termKey", value: "mammals")]
array.map({ $0.value })
И вы получите массив значений, который выглядит так:
["respiration", "mammals"]
Используйте compactMap
в массиве и найдите ключ словаря в замыкании:
let questionData = [["termKey": "respiration"], ["termKey": "mammals"], ["badKey": "foo"]]
let values = questionData.compactMap { $0["termKey"] }
print(values)
["respiration", "mammals"]
compactMap
запускает закрытие для каждого элемента в массиве, чтобы создать новый массив. Здесь мы ищем значение для ключа "termKey"
. Словарный поиск возвращает необязательное значение. Если ключа нет, результатом будет nil
. compactMap
пропускает значения nil
и разворачивает имеющиеся значения.
Декодируйте JSON в структуры и map
результат в termKey
значения questionData
.
struct Response: Decodable {
let questionData : [Question]
}
struct Question: Decodable {
let termKey : String
}
let jsonString = """
{"questionData": [{"termKey": "respiration"},{"termKey": "mammals"}]}
"""
let data = Data(jsonString.utf8)
do {
let result = try JSONDecoder().decode(Response.self, from: data)
let termKeys = result.questionData.map{$0.termKey}
} catch { print(error) }