2014-11-05 7 views
11

Quindi, sto imparando come ottenere dati da DB con JSON e quindi inserire i dati su un array. Problemi nell'ultima riga, citiesArray.addObject(City()), quando ho bisogno di mettere tutti i dati dall'oggetto city (id, nome, stato, ...) nella matrice. Stavo guardando riga per riga con il compilatore, e fondamentalmente tutto va bene, tranne che alla fine, il mio array è ancora vuoto (il suo valore è 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

L'ultima riga dovrebbe probabilmente essere ' citiesArray.addObject (city) '... –

+0

Ho provato City(), city, City, city.cityName, City(). cityName. Niente ha funzionato – Jaco2201

+1

Dove viene dichiarato 'citiesArray'? Dove/come viene inizializzato? –

risposta

14

Un paio di problemi:

  1. È suggerito che si stava tentando di aggiungere la città con la seguente riga di codice:

    citiesArray.addObject(City()) 
    

    Il City() costrutto sarà un'istanza di un nuovo , vuoto City oggetto. Quindi, tale linea di codice, nel migliore dei casi, aggiungerebbe un oggetto vuoto City all'array, che non è quello che intendevi.

    Quando si aggiunge il city al citiesArray, si dovrebbe semplicemente:

    citiesArray.addObject(city) 
    
  2. Tu dici che hai definito il tuo citiesArray in questo modo:

    var citiesArray: NSMutableArray! 
    

    È inoltre necessario creare un'istanza di un oggetto per questa variabile (ad esempio, crea un oggetto a cui questa variabile ora punta), ad esempio:

    citiesArray = NSMutableArray() 
    
  3. Si sta segnalando, tuttavia, che alla fine di questo ciclo, che citiesArray è nil. Veramente?!? Ma se hai provato a chiamare il metodo addObject e citiesArray è stato nil, potresti aver ricevuto un errore irreversibile: "Trovato in modo imprevisto nil mentre scartando un valore Opzionale".

    Quindi, se citiesArray era nil, allora anche jsonArray deve essere stato vuoto. O per qualche motivo non sei nemmeno arrivato a questo ciclo. Suggerirei (a) logging jsonArray; e (b) registra o inserisce breakpoint all'interno di questo ciclo e conferma che stai arrivando anche qui come pensi di essere.

    Inoltre, controllare i tempi di questa (cioè assicurarsi che la vostra dichiarazione di registrazione citiesArray è in realtà avvenendo dopo questa routine che lo popola).So che sembra pazzesco, ma se stai recuperando i dati da alcune risorse di rete in modo asincrono, potresti avere alcuni problemi legati alla temporizzazione.

  4. Poiché stai scrivendo il codice Swift, potresti prendere in considerazione l'utilizzo di array Swift. Ad esempio, definire la variabile array come

    var citiesArray: [City]! 
    

    E istanziare con:

    citiesArray = [City]() 
    

    E aggiungere oggetti ad essa con:

    citiesArray.append(city) 
    
+0

Grazie! Ho dimenticato di aggiungere cityArray() per istanziare, e ho messo "City()" escluso di "city", quindi anche quello è stato un errore. Ora funziona tutto bene! – Jaco2201

+2

Un buon approccio a "array Swift". Grazie! –

+0

bene, stavo cercando di aggiungere l'array di stringhe invece di Object array. La tua risposta ha aiutato! – Naishta

6

Sono abbastanza sicuro che è necessario utilizzare la funzione di aggiunta:

citiesArray.append(city) 

o

se si desidera aggiungere alla partenza della matrice

citiesArray.insert(city, atIndex: 0) 

invece di

citiesArray.addObject(City()) 

Ecco un piccolo esempio: la sintassi potrebbe non essere al 100% non compatibile con xcode in questo momento.

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