Как вам сказали, самый простой подход - это просто вычисляемое свойство, которое ссылается на желаемое значение.Однако для полноты картины мы могли бы также обсудить, как сделать то, что вы на самом деле просили.Давайте проиллюстрируем сокращенной версией вашего JSON:
{
"dt": 1558321200,
"weather": [{
"id": 800,
"main": "Clear",
"description": "clear sky",
"icon": "01n"
}]
}
Итак, вопрос в том, как мы можем проанализировать это, скажем, в виде структуры Result со свойством description
, таким образом, чтобы мы получили "description"
ключ от первого элемента в массиве "weather"
?Вот один из подходов:
struct Result : Decodable {
let description : String
enum Keys : CodingKey {
case weather
}
struct Weather : Decodable {
let description : String
}
init(from decoder: Decoder) throws {
let con = try! decoder.container(keyedBy: Keys.self)
var arr = try! con.nestedUnkeyedContainer(forKey: .weather) // weather array
let oneWeather = try! arr.decode(Weather.self) // decode first element
self.description = oneWeather.description
}
}
По сути, идея в том, что nestedUnkeyedContainer
дает нам наш массив, и последующие вызовы decode
в этом массиве автоматически решают каждый элемент по очереди.У нас есть только один элемент, поэтому нам нужен только один вызов decode
.Как мы распоряжаемся полученной строкой, зависит от нас, поэтому теперь мы можем вставить ее в наше свойство description
верхнего уровня.
Но вот другой подход.Нам даже не нужна вторичная структура Weather;мы можем просто погрузиться прямо в массив "weather"
, взять первый элемент словаря и получить доступ к его ключу "description"
, не говоря больше о том, что находится в этом внутреннем словаре, например:
struct Result : Decodable {
let description : String
enum Keys : CodingKey {
case weather
case description
}
init(from decoder: Decoder) throws {
let con = try! decoder.container(keyedBy: Keys.self)
var arr = try! con.nestedUnkeyedContainer(forKey: .weather)
let con2 = try! arr.nestedContainer(keyedBy: Keys.self)
let desc = try! con2.decode(String.self, forKey: .description)
self.description = desc
}
}
Ваш вопрос былне очень полный (вы не показали свой реальный JSON, просто отрывок), поэтому я не могу дать более точный совет, но я уверен, что вы сможете увидеть, как адаптировать эту технику к вашим потребностям.