Ваш код не работает из-за сбоя первого условного понижения.
Значение ключа types
равно [Dictionary<String, Any>]
(обратите внимание на вложенный словарь в JSON), а не [Dictionary<String, String>]
.
Так что в основном это работает
if let types = dict["types"] as? [Dictionary<String, Any>] , types.count > 0 {
if let type = types[0]["type"] as? Dictionary<String, String> {
if let name = type["name"] {
self._type = name.capitalized
}
}
print("TypeAA: \(self._type)")
} else {
self._type = ""
}
Но пирамида гибели громоздка и никогда не проверяет пустой массив с .count > 0
, так что этоболее эффективный
if let types = dict["types"] as? [Dictionary<String, Any>],
let firstType = types.first, let typeInfo = firstType["type"] as? Dictionary<String, String>,
let name = typeInfo["name"] {
self._type = name.capitalized
print("TypeAA:", self._type)
} else {
self._type = ""
}
Если вам нужно рассмотреть все имена, вы должны использовать цикл
if let types = dict["types"] as? [Dictionary<String, Any>] {
for type in types {
if let typeInfo = type["type"] as? Dictionary<String, String>,
let name = typeInfo["name"] {
print("TypeAA:", name)
}
}
} else {
self._type = ""
}
Если вы хотите напечатать все имена через запятую, используйте
if let types = dict["types"] as? [Dictionary<String, Any>] {
let names = types.compactMap { type -> String? in
guard let typeInfo = type["type"] as? Dictionary<String, String>,
let name = typeInfo["name"] else { return nil }
return name
}
print(names.joined(separator: ", "))
}