所以,我正在学习如何使用JSON从DB获取数据,然后将数据放在某个数组上。当我需要将对象citiesArray.addObject(City())
(id,name,state,...)中的所有数据放入数组时,最后一行city
会出现问题。
我一直在逐行看编译器,基本上一切都很好,除了最后,我的数组仍然是空的(它的值是nil
)?
for (var i=0;i<jsonArray.count;i++){
//Create city objec
var cID: AnyObject? = jsonArray.objectAtIndex(i).objectForKey("id") as NSString
var cName: AnyObject? = jsonArray.objectAtIndex(i).objectForKey("cityName") as NSString
var cState: AnyObject? = jsonArray.objectAtIndex(i).objectForKey("cityState") as NSString
var cPopulation: AnyObject? = jsonArray.objectAtIndex(i).objectForKey("cityPopulation") as NSString
var cCountry: AnyObject? = jsonArray.objectAtIndex(i).objectForKey("country") as NSString
//add city obj (i have City class) to city array
var city = City()
city.cityID = cID as NSString
city.cityName = cName as NSString
city.cityState = cState as NSString
city.cityPopulation = cPopulation as NSString
city.cityCountry = cCountry as NSString
citiesArray.addObject(City())
}
答案 0 :(得分:14)
有几个问题:
您建议您尝试使用以下代码行添加城市:
citiesArray.addObject(City())
City()
构造将实例化一个新的空白City
对象。因此,在最佳情况下,该行代码会向您的数组添加一个空白City
对象,这不是您想要的。
当您将city
添加到citiesArray
时,您应该只是:
citiesArray.addObject(city)
你说你已经定义了citiesArray
,所以:
var citiesArray: NSMutableArray!
您还需要为此变量实例化一个对象(即创建一个此变量现在指向的对象),例如:
citiesArray = NSMutableArray()
您正在报告,在此循环结束时,citiesArray
为nil
。真?!?但是,如果您尝试调用addObject
方法且citiesArray
为nil
,则可能会收到致命错误:“在展开”可选“值时意外地发现”无“。
因此,如果citiesArray
为nil
,则jsonArray
也必须为空。或者由于某种原因你甚至没有进入这个循环。我建议(a)记录jsonArray
; (b)在这个循环中记录或放置断点并确认你甚至像你认为的那样进入这里。
此外,请检查此时间(即确保您的语句记录citiesArray
实际发生 此例程填充后)。我知道这听起来很疯狂,但如果你是异步地从某些网络资源中检索数据,你可能会遇到一些与时间相关的问题。
由于您正在编写Swift代码,因此可以考虑使用Swift数组。例如,将数组变量定义为
var citiesArray: [City]!
用以下方式实例化:
citiesArray = [City]()
使用以下命令添加对象:
citiesArray.append(city)
答案 1 :(得分:6)
我很确定你需要使用追加功能:
citiesArray.append(city)
或
如果你想追加数组的开头
citiesArray.insert(city, atIndex: 0)
而不是
citiesArray.addObject(City())
这里有一个小例子:语法现在可能不是100%不与xcode一起使用。
var strA:String = "apple"
var strB:String = "pineapple"
var strArr = ["kiwi", "mango", "lime"]
strArr.append(strA)
println(strArr.count) //4 ["kiwi", "mango", "lime", "apple"]
citiesArray.insert(strB, atIndex: 0)
println(strArr.count) //5 ["pineapple", "kiwi", "mango", "lime", "apple"]