Преобразование в Swift 4, неоднозначная ошибка индекса - PullRequest
0 голосов
/ 27 мая 2018

Я новичок в Swift и в настоящее время сталкиваюсь с проблемой в выделенном разделе кода, ошибка заключается в неоднозначном использовании индекса.Я пробовал другие решения, которые я мог найти на stackoverflow, но не мог решить.Пожалуйста, помогите мне понять ошибку и ее решение.

do{
    guard let jsonData = data else {
       throw MyError.FoundNil("JSON data issue!")
    }

    guard let dictionaryData = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! [String:AnyObject] else {
        throw MyError.SerializationError("Unable to serialize")
    }

    guard let city = dictionaryData["city"]!["name"]!,
          // Error on next three lines
          let data1 = dictionaryData["list"]![0]! as? [String: AnyObject],
          let data2 = dictionaryData["list"]![1]! as? [String: AnyObject],
          let data3 = dictionaryData["list"]![2]! as? [String: AnyObject],
          let t1 = data1["t"] as? [String: AnyObject],
          let t2 = data2["t"] as? [String: AnyObject],
          let t3 = data3["t"] as? [String: AnyObject],
          let wDay1 = data1["w"]![0]! as? [String:AnyObject],
          let wDay2 = data2["w"]![0]! as? [String:AnyObject],
          let wDay3 = data3["w"]![0]! as? [String:AnyObject]
    else {
        throw MyError.DataPopulateError("Mismatch in assigning values from dictionary")
    }

1 Ответ

0 голосов
/ 28 мая 2018

Во-первых, не используйте 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")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...