Разыграть AnyObject? to [String:AnyObject?] всегда терпит неудачу

Изначально у меня был этот код в Swift 2.1

func onSuccess(jsonData: AnyObject?){
    print(jsonData["message"]) 
}

После того, как я обновился до Swift 2.2, у меня возникла такая ошибка, как

Неоднозначная ссылка на «подстрочный индекс»

для строки print(jsonData["message"])

Я изменил свой код на этот

func onSuccess(jsonData: AnyObject?) {

        let json = (jsonData as? [String:AnyObject?]) ?? ["":""]
        print(json)
}

Однако это утверждение всегда терпит неудачу, потому что AnyObject? к [String: AnyObject?] приведение типа не происходит и получает значение объединения nil. Я хочу ввести преобразование от AnyObject? до [String:AnyObject]. Является ли это возможным?


person MrDank    schedule 04.04.2016    source источник
comment
опубликуйте свою структуру JSON   -  person Venk    schedule 04.04.2016
comment
Типа [String:AnyObject?] вообще не существует, поскольку по определению все ключи и значения словаря должны быть необязательными типами.   -  person vadian    schedule 04.04.2016


Ответы (2)


Вы получаете Ambiguous reference to 'subscript' из-за вашего jsonData["message"] в Swift 2.2, вы должны использовать objectForKey вместо ["key"]. В вашем случае вы должны написать свой код следующим образом jsonData.objectForKey("message") это ваш первый вопрос.

Ответ на второй вопрос: Вы уверены, что ваши данные JSON являются словарем? Я думаю, что ваши данные представляют собой массив словарей. Если я прав. Вы должны привести jsonData к массиву словарей следующим образом;

if let json = jsonData as? [[String:AnyObject?]] {
    for data in jsonData { // Enumerate the array of dicts to get value.
        print(data.objectForKey("message"))
    }
}
person emresancaktar    schedule 04.04.2016

Вы можете просто использовать необязательную привязку следующим образом:

func onSuccess(jsonData: AnyObject?) {
    if let json = jsonData as? [String:AnyObject] {
        print(json["message"])
    }
}

Нет веской причины объявлять значение словаря как необязательное, например [String:AnyObject?], поскольку словари Swift все равно всегда возвращают необязательное значение.

Этот пример был для декодирования словаря.

Теперь, если ваш jsonData не словарь, а, скажем, массив словарей, вы просто адаптируете тип:

func onSuccess(jsonData: AnyObject?) {
    if let json = jsonData as? [[String:AnyObject]] {
        for object in json {
            print(object["message"])
        }
    }
}

И т. д.

person Eric Aya    schedule 04.04.2016