2014-11-05 2 views
11

Итак, я изучаю, как получить данные из БД с помощью JSON, а затем поместить данные на некоторый массив. Проблема accours на последней строке, citiesArray.addObject(City()), когда мне нужно поместить все данные из объекта city (id, name, state, ...) в массив. Я смотрел строки за строкой с компилятором, и в основном все хорошо, за исключением того, что в конце мой массив по-прежнему пуст (его значение равно nil)?Swift addObject

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()) 
} 
+1

Последняя строка должна, вероятно, будет ' citiesArray.addObject (город) '... –

+0

Я пробовал City(), город, город, city.cityName, City(). cityName. Ничего не получилось. – Jaco2201

+1

Где находится 'cityArray'? Где/как оно инициализируется? –

ответ

14

Пару вопросов:

  1. Вы предположили, что вы пытаетесь добавить город с помощью следующей строки кода:

    citiesArray.addObject(City()) 
    

    City() конструкция будет создавать новый экземпляр , пустой City объект. Таким образом, строка кода, в лучшем случае, добавит пустой объект City в ваш массив, что не так, как вы планировали.

    Когда вы добавляете city к вашему citiesArray, вы должны просто:

    citiesArray.addObject(city) 
    
  2. Вы говорите, что вы определили свой citiesArray так:

    var citiesArray: NSMutableArray! 
    

    Кроме того, необходимо создать экземпляр объекта для этой переменной (т. е. создать объект, на который теперь будет указываться эта переменная), например:

    citiesArray = NSMutableArray() 
    
  3. Вы сообщаете, однако, что в конце этого цикла citiesArray является nil. В самом деле?!? Но если вы попытались вызвать метод , а citiesArray - nil, вы могли бы получить фатальную ошибку: «неожиданно найдено нуль при распаковке необязательного значения».

    Итак, если citiesArray был nil, то jsonArray, должно быть, был пуст. Или по какой-то причине вы даже не дошли до этого цикла. Я бы предложил (а) вести журнал jsonArray; и (б) лог или поставить точку останова в этом цикле и подтвердить, что вы даже попадаете сюда, как вы думаете.

    Кроме того, проверьте сроки этого (то есть убедиться, что ваше заявление ведения журнала citiesArray на самом деле происходит после этой процедуры, заполняющей его).Я знаю, что это звучит безумно, но если вы извлекаете данные из какого-то сетевого ресурса асинхронно, у вас могут быть некоторые проблемы, связанные с синхронизацией.

  4. Поскольку вы пишете код Swift, вы можете использовать массивы Swift. Например, определить переменную массива, как

    var citiesArray: [City]! 
    

    И создать его экземпляр с:

    citiesArray = [City]() 
    

    И добавить объекты к нему:

    citiesArray.append(city) 
    
+0

Спасибо! Я забыл добавить citiesArray() для экземпляра, и я поставил «City()», кроме «города», так что это тоже было ошибкой. Теперь все работает хорошо! – Jaco2201

+2

Хороший подход к «Swift массивам». Спасибо! –

+0

хороший, я пытался добавить массив строк вместо массива объектов. Ваш ответ помог! – Naishta

6

Я уверен, что вам нужно использовать функцию на добавление:

citiesArray.append(city) 

или

, если вы хотите добавить в начало массива

citiesArray.insert(city, atIndex: 0) 

вместо от

citiesArray.addObject(City()) 

вот небольшой пример: синтаксис может быть не 100% не на comp с 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"] 
Смежные вопросы