Во-первых, не используйте AnyObject
.Определите ваш словарь как [String: Any]
.
Далее, проблема в том, что когда вы делаете что-то вроде dictionaryData["some key"]
, у вас теперь есть Any
.Это должно быть брошено, чтобы сделать что-нибудь еще с этим.Ошибка в попытке использовать доступ к индексу массива на Any
.
Наконец, вы неправильно используете оператор !
.Весь смысл guard let
состоит в том, чтобы безопасно развернуть и безопасно использовать значение.Вы побеждаете весь смысл, используя !
, что приведет к сбою вашего приложения, если данные не соответствуют вашим кодам.
Обновите 2-го охранника следующим образом:
guard let dictionaryData = try? JSONSerialization.jsonObject(with: jsonData, options: []) as! [String:Any] else {
throw MyError.SerializationError("Unable to serialize")
}
Тогдапереписать свой большой guard
следующим образом:
guard let city = (dictionaryData["city"] as? [String:Any])?["name"] as? String,
let list = dictionaryData["list"] as? [[String:Any]], list.count >= 3,
let t1 = list[0]["t"] as? [String:Any],
let t2 = list[1]["t"] as? [String:Any],
let t3 = list[2]["t"] as? [String:Any],
let wDay1 = (list[0]["w"] as? [[String:Any]])?.first,
let wDay2 = (list[1]["w"] as? [[String:Any]])?.first,
let wDay3 = (list[2]["w"] as? [[String:Any]])?.first
else {
throw MyError.DataPopulateError("Mismatch in assigning values from dictionary")
}