When parsing JSON, I get NSDictionary and go through it one (known) key at a time. When debugging a bug, I started wondering: how should I handle missing key vs value which is zero?
Earlier I would have used something like this to check if key exists or not:
if ([dict objectForKey:@"public"])
newItem.isPublic = [dict objectForKey:@"public"] ? YES : NO;
but now I wrote this using Objective-C object literals. Just started wondering, what does this check actually do:
if (dict[@"public"])
newItem.isPublic = dict[@"public"] ? @YES : @NO;
Should I check against nil or [NSNull null] or is there some easier, obvious, way?
The new literal syntax makes no difference here. The
dict[@"public"]code is translated into[dict objectForKeyedSubscript:@"public"], which is documented to be the same asvalueForKey:, which in turn callsobjectForKey:.As for the conditional test, writing
if ([dict objectForKey:@"foo"])is the same asif ([dict objectForKey:@"foo"] != nil). In other words,[NSNull null]counts as true here, so you have to check explicitly if you want a different behaviour. Zero can’t be directly stored in a dictionary, it would have to be wrapped in anNSNumber, again being treated as a true value.See also the Objective-C Literals spec and NSDictionary Class Reference.