2012-03-01 10 views
9

Ricevo qualche risposta da JSON, e sta lavorando bene, ma ho bisogno di verificare la presenza di alcuni null valori,ios controllare se NSArray == null

ho trovato risposte diverse, ma sembra non funziona ancora,

NSArray *productIdList = [packItemDictionary objectForKey:@"ProductIdList"]; 

ho provato con

if (!productIdList.count) //which breaks the app, 

if (productIdList == [NSNull null]) // warning: comparison of distinct pointer types (NSArray and NSNull) 

Allora, cosa sta succedendo? Come risolvere questo problema e controllare null nel mio array?

Grazie!

+1

Cosa intendi con "frena l'app"? Se si sta sollevando un'eccezione, pubblica i messaggi di log. –

risposta

31

eliminare l'avvertimento con un cast:

if (productIdList == (id)[NSNull null]) 

Se productIdList è infatti [NSNull null], poi facendo productIdList.count solleverà un'eccezione perché NSNull non capisce il messaggio count.

+0

@MaKo ... e, implicitamente, funziona perché '[NSNull null]' restituisce sempre lo stesso oggetto. '==' confronta l'identità, non il valore. – Tommy

+0

Ho perso il cast in 'id' e mancava questo controllo (ignorato a causa dell'avvertimento del compilatore) per molto tempo! Grazie! – Jean

+0

Perfetto .. !! Grazie –

0

si dovrebbe essere chiaro ciò che si desidera controllare: l'array è nullo il che significa che la variabile non esiste:


array == nil 

O la matrice ha elemento zero, che è possibile:


[array count] == 0 
+0

La classe 'NSDictionary' non può memorizzare' nil' come valore, quindi i parser JSON (e i parser degli elenchi di proprietà) usano '[NSNull null]' invece di rappresentare un valore nullo, perché c'è una differenza tra una chiave presente con un valore nullo e una chiave assente. –

+0

Hai ragione. Non ho visto è da JSON. – scorpiozj

+0

La prima riga dice tutto. –

7

È anche possibile controllare la classe di un oggetto utilizzando il metodo isKindOfClass:.

Ad esempio, nel tuo caso si potrebbe fare seguente:

if ([productIdList isKindOfClass:[NSArray class]]) 
{ 
    // value is valid 
} 

o (se si è certi che NSNull indica valore non valido)

if([productIdList isKindOfClass:[NSNull class]]) 
{ 
    // value is invalid 
} 
+0

Esiste solo un'istanza singleton di 'NSNull', quindi usare' == 'per verificare che sia più breve e più efficiente. –

+0

Ma il controllo del tipo di oggetto restituito è più sicuro. – Nekto

6

È possibile utilizzare il selettore isEqual:

if ([productIdList isEqual:[NSNull null]]) 
Problemi correlati