NSNull si arresta in modo anomalo a initWithDictionary
-
05-07-2019 - |
Domanda
Sto analizzando un file JSON.
Dopo aver ottenuto NSDictionary, analizzo gli oggetti nel dizionario in una matrice di oggetti. Tuttavia, per alcuni file JSON, ottengo NULL, che dovrebbe andare bene, ma si blocca la mia app per quei luoghi in cui mi aspetto qualcosa ma diventando null:
- (id)initWithDictionary:(NSDictionary *)boxDictionary {
if ([self init]) {
// ...
int numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
int numberOfItemsInBoxes = [[boxDictionary valueForKey:@"box_items_count"] intValue];
// ..
}
return self;
}
Soluzione
Il problema di base sembra essere che non esiste alcun metodo intValue su NSNull che torni dalla chiamata a valueForKey :.
Potresti aggiungere il metodo intValue, ma cosa vorresti che restituisse per un NSNull? 0? -1?
Il codice da fare sarebbe simile a questo.
In MyNullExtensions.h:
@interface NSNull (integer)
-(int) intValue;
@end
E in MyNullExtensions.m:
#import "MyNullExtensions.h"
@implementation NSNull (functional)
-(int) intValue
{
return -1;
}
@end
In seguito, Blake.
Altri suggerimenti
Un int
non può essere zero
, quindi intValue
non ha alcun modo di dirti che non è possibile ottenere il intValue
di un oggetto nil
. Devi verificare se hai ricevuto un oggetto restituito da valueForKey:
prima di chiedere il suo intValue
.
if ([boxDictionary valueForKey:@"box_count"])
numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
Fai un semplice test contro NSNull prima di chiamare intValue. Non è necessario estendere l'oggetto NSNull.
if ([rate valueForKey:@"value"]!=[NSNull alloc]) {
// put your code here
}