【发布时间】:2012-02-04 02:28:24
【问题描述】:
我正在为 NSManagedObject 的属性设置值,这些值来自从 JSON 文件正确序列化的 NSDictionary。我的问题是,当某个值为[NSNull null] 时,我不能直接分配给该属性:
fight.winnerID = [dict objectForKey:@"winner"];
这会引发NSInvalidArgumentException
"winnerID"; desired type = NSString; given type = NSNull; value = <null>;
我可以轻松地检查 [NSNull null] 的值,然后分配 nil:
fight.winnerID = [dict objectForKey:@"winner"] == [NSNull null] ? nil : [dict objectForKey:@"winner"];
但我认为这并不优雅,并且需要设置很多属性。
此外,在处理 NSNumber 属性时,这会变得更加困难:
fight.round = [NSNumber numberWithUnsignedInteger:[[dict valueForKey:@"round"] unsignedIntegerValue]]
NSInvalidArgumentException 现在是:
[NSNull unsignedIntegerValue]: unrecognized selector sent to instance
在这种情况下,我必须先处理[dict valueForKey:@"round"],然后再为其设置NSUInteger 值。而且单线解决方案已经没有了。
我尝试创建一个@try @catch 块,但是一旦捕获到第一个值,它就会跳过整个@try 块并且忽略下一个属性。
有没有更好的方法来处理[NSNull null],或者可能使这完全不同但更容易?
【问题讨论】:
-
出于好奇,在数字的情况下,您为什么要解开并重新包装数字?
fight.round = [dict objectForKey:@"round"]怎么了? -
@KevinBallard 不可接受的属性值类型:property = "round";所需类型 = NSNumber;给定类型 = __NSCFString;值 = 3。
-
如果是
NSString,那么-unsignedIntegerValue将不起作用,因为NSString上没有定义该方法。您可以改用-integerValue,它在NSNumber和NSString上都定义了。
标签: objective-c json parsing nsmanagedobject nsnull