在目标C中,一种常见的做法是经常放弃对nil的检查,而依赖于消息传递nil默默失败的事实。
例如,要验证字符串:
if ([myString length] > 1) { // Short and sweet如果myString为零,则此检查将失败--正如预期的那样。与假定正确的实现相比,这是一个巨大的改进,显式地检查为零:
if (myString && [myString length] > 1) { // Redundant nil check然而,特别是在web的情况下,myString可以想象出等同于[NSNull null] --类似于零,但行为不同。主要关注的是消息传递NSNull会导致异常。例如,我们前面的简单解决方案将导致异常:
// Causes an exception, because [NSNull null] is an object
NSString *myString = (id)[NSNull null];
if ([myString length] > 1) { 更复杂的是,一个简单的零检查实际上会使通过,因为[NSNull null]是一个有效的对象:
NSString *myString = (id)[NSNull null];
if (myString) { // Evals to YES因此,实现完全安全的唯一方法是通过调用一个方法来检查NSNull和执行常规的隐式零检查:
if (myString != (id)[NSNull null] && [myString length] > 1) { // Short and sweet我的问题:这真的有必要吗?有一个更简洁的选择,少重复的代码,我忽略了吗?事实上,我的结论是正确的吗?
发布于 2014-12-16 17:51:31
NSNull对象通常会出现在读取包含空值的JSON文件的人身上。
在这种情况下,提供空值的服务器有可能认为您应该做一些与没有值不同的事情。例如,如果您得到一个字典,并且可能有一个字符串存储在某个键下,您可能会得到一个长度为非零的字符串,您可能会得到一个空字符串,因为服务器发送了一个空字符串,您可能什么也没有得到,因为服务器没有发送任何消息,或者您可能得到NSNull空值,因为服务器发送了一个空值。这取决于您是否需要对空字符串、空字符串、空字符串和NSNull空值进行不同的处理。
顺便说一句:我一直使用NSDictionary类的一些扩展,例如- ( NSString *)stringForKey,它将返回一个NSString或零,100%保证。如果这样做,所有错误检查都在一个方法中。您可以将NSNumber转换为NSString,或将NSNull转换为零,或将NSDictionary等转换为零,以后再也不用担心了。当然,您需要检查它是否合适。
发布于 2014-12-16 18:02:19
除了其他答案之外,您还可以在将API响应解析为模型对象之前考虑replacing NSNull instances with empty strings。类似地,您可以遍历响应字典的可变副本,并删除其值包含NSNull的键。
基本上,当您得到响应时,先做它,这样您的代码就不会被NSNull检查弄得乱七八糟。
发布于 2020-06-02 20:12:50
另一种处理此问题的方法是使用类别:
@interface NSNull (Utilities)
- (NSString *)stringValue;
@end
@implementation NSNull (Utilities)
- (NSString *)stringValue
{
return nil;
}
@end然后简单地说:
[myDictionary[@"key"] stringValue] // returns nil for NSNull valueshttps://stackoverflow.com/questions/27509542
复制相似问题