Используя as! [String:String]
, вы говорите, что все значения в словаре будут иметь тип String, но вложенный JSON, связанный с ключом состояния, очевидно, не является String
, использует as? [String: Any]
, а затем приводит вашдругие свойства по мере необходимости.result["error"] as String
Использование этого метода затрудняет получение вложенных данных:
if let state = result["state"] as? [String: String] {
let name = state["name"]
let value = state["value"]
}
Примечания
- При использовании Swift 4 илибольше вы должны использовать Codable Protocol
- Вы не должны быть принудительным развертыванием, используйте условное развертывание (
as? [String: Any]
)
РЕДАКТИРОВАТЬ:
Пример того, как вы можете сделать это с помощью Codable и как он используется.
Код игровой площадки
// you dont need this part, I am not making network request
let jsonData = """
{"error":"true","message":"no","state":{"id":"1","name":"empty"}}
""".data(using: .utf8)
struct ErrorState: Codable
{
let id: String
let name: String
}
struct ErrorResponse: Codable
{
let error: String
let message: String
let state: ErrorState
}
guard let data = jsonData else { fatalError() }
let errorResponse = try? JSONDecoder().decode(ErrorResponse.self, from: data)
print(errorResponse?.state.name)