AnyObject? не имеет члена с именем 'objectAtIndex'

Получил ошибку (Xcode6 BETA 6), если попытался получить объект строки:

let jsonString : String = "[{\"name\":[\"Fred\",\"John\"],\"age\":21},{\"name\":\"Bob\",\"age\":35}]"

let myData:NSData? = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)

var jsonResult:NSArray = NSJSONSerialization.JSONObjectWithData(myData!, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSArray

println(jsonResult.objectAtIndex(0).objectForKey("name").objectAtIndex(0))

print никогда не вызывается, причина ошибки. Есть идеи?

3 ответа

Решение

Получение значения из NSDictionary или NSArray возвращает объект AnyObject. Поэтому вы должны набрать приведение к соответствующему типу. Попробуй это

println(((jsonResult.objectAtIndex(0) as NSDictionary).objectForKey("name") as NSArray).objectAtIndex(0))

Другим вариантом было бы разыграть jsonResult для Array<AnyObject> и использовать subscript синтаксис для получения необходимого значения

let jsonString : String = "[{\"name\":[\"Fred\",\"John\"],\"age\":21},{\"name\":\"Bob\",\"age\":35}]"
let myData:NSData? = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
var jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(myData!, options: NSJSONReadingOptions.MutableContainers, error: nil);

if let lJsonArray = jsonResult as? Array<AnyObject> {
    println(lJsonArray[0].objectForKey("name")[0])
}

Я бы предложил создать один или несколько классов и десериализовать этот JSON, чтобы улучшить доступ к данным и избежать ошибок при доступе.

Кстати, делая типы данных более явными, это работает:

let dict = jsonResult.objectAtIndex(0) as NSDictionary
let array = dict["name"] as NSArray

println(array.objectAtIndex(0))
Другие вопросы по тегам