Видя ваш вывод, ваш firstRow["elements"]
является опциональным, поэтому вам нужно развернуть его. И это на самом деле NSArray с одним элементом, где единственным элементом является словарь, с 4 записями - «расстояние», «продолжительность», «duration_in_traffic» и «статус». Возможно, вам придется привести элемент в словарь, чтобы получить доступ к каждой записи.
Для этой цели вы можете использовать опциональную привязку с as?
-кастингом:
fetchData { (dict, error) in
if let rows = dict?["rows"] as? [[String: Any]] {
if let firstRow = rows.first {
print("firstRow is")
print(firstRow["elements"])
//Unwrap and cast `firstRow["elements"]`.
if let elements = firstRow["elements"] as? [[String: Any]] {
//The value for "duration" is a Dictionary, you need to cast it again.
if let duration = elements.first?["duration"] as? [String: Any] {
print(duration["text"] as? String)
print(duration["value"] as? Int)
}
}
}
}
}
Или слишком глубоко вложенные if
трудно читать, поэтому кто-то хотел бы это как:
fetchData { (dict, error) in
if
let rows = dict?["rows"] as? [[String: Any]],
let firstRow = rows.first,
let elements = firstRow["elements"] as? [[String: Any]],
let duration = elements.first?["duration"] as? [String: Any]
{
print(duration["text"] as? String)
print(duration["value"] as? Int)
}
}
Или использование guard
может быть лучшим решением.
Или, если вы можете показать нам весь текст JSON в удобочитаемом формате, кто-то покажет вам, как использовать Codable, который является современным способом работы с JSON в Swift.