NSNull stürzt mein initWithDictionary
-
05-07-2019 - |
Frage
Ich bin Parsen eine JSON-Datei.
Nach dem NSDictionary bekommen, analysiere ich die Objekte im Wörterbuch in ein Array von Objekten. Doch für bestimmte JSON-Dateien, bekomme ich NULL, was in Ordnung sein sollte, aber es stürzt meine app für diejenigen Ort, wo ich erwarte etwas, aber immer 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;
}
Lösung
Das grundlegende Problem scheint zu sein, dass es keine intValue Methode auf dem NSNull ist, dass Sie wieder aus dem Aufruf von ValueForKey bekommen.
Sie könnten die intValue Methode, fügen aber was würden Sie es für einen NSNull zurückkehren? 0? -1?
Der Code zu tun, das wäre in etwa so aussehen.
In MyNullExtensions.h:
@interface NSNull (integer)
-(int) intValue;
@end
Und in MyNullExtensions.m:
#import "MyNullExtensions.h"
@implementation NSNull (functional)
-(int) intValue
{
return -1;
}
@end
Später, Blake.
Andere Tipps
Ein int
kann nicht nil
werden, so intValue
hat keine Möglichkeit, Ihnen zu sagen, es nicht die intValue
eines nil
Objekt bekommen. Sie müssen prüfen, ob Sie von valueForKey:
zurück ein Objekt bekam, bevor Sie für seine intValue
fragen.
if ([boxDictionary valueForKey:@"box_count"])
numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
Sie einfach einen einfachen Test gegen NSNull, bevor Sie intValue nennen. Keine Notwendigkeit zu erweitern NSNull Objekt.
if ([rate valueForKey:@"value"]!=[NSNull alloc]) {
// put your code here
}