Swift addObject

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

Ответ 1

Несколько проблем:

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

    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 также должен был быть пустым. Или по какой-то причине вы даже не дошли до этого цикла. Я бы предложил (а) протоколировать jsonArray; и (б) запишите лог или положите точку останова внутри этого цикла и подтвердите, что вы даже попадаете сюда, как вы думаете.

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

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

    var citiesArray: [City]!
    

    И создайте его с помощью:

    citiesArray = [City]()
    

    И добавьте к нему объекты с помощью:

    citiesArray.append(city)
    

Ответ 2

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

 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"]