首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理NSNull值

如何处理NSNull值
EN

Stack Overflow用户
提问于 2014-12-16 16:38:36
回答 3查看 1.4K关注 0票数 0

在目标C中,一种常见的做法是经常放弃对nil的检查,而依赖于消息传递nil默默失败的事实。

例如,要验证字符串:

代码语言:javascript
复制
if ([myString length] > 1) { // Short and sweet

如果myString为零,则此检查将失败--正如预期的那样。与假定正确的实现相比,这是一个巨大的改进,显式地检查为零:

代码语言:javascript
复制
if (myString && [myString length] > 1) { // Redundant nil check

然而,特别是在web的情况下,myString可以想象出等同于[NSNull null] --类似于零,但行为不同。主要关注的是消息传递NSNull会导致异常。例如,我们前面的简单解决方案将导致异常:

代码语言:javascript
复制
// Causes an exception, because [NSNull null] is an object
NSString *myString = (id)[NSNull null];
if ([myString length] > 1) { 

更复杂的是,一个简单的零检查实际上会使通过,因为[NSNull null]是一个有效的对象:

代码语言:javascript
复制
NSString *myString = (id)[NSNull null];
if (myString) { // Evals to YES

因此,实现完全安全的唯一方法是通过调用一个方法来检查NSNull和执行常规的隐式零检查:

代码语言:javascript
复制
if (myString != (id)[NSNull null] && [myString length] > 1) { // Short and sweet

我的问题:这真的有必要吗?有一个更简洁的选择,少重复的代码,我忽略了吗?事实上,我的结论是正确的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-16 17:51:31

NSNull对象通常会出现在读取包含空值的JSON文件的人身上。

在这种情况下,提供空值的服务器有可能认为您应该做一些与没有值不同的事情。例如,如果您得到一个字典,并且可能有一个字符串存储在某个键下,您可能会得到一个长度为非零的字符串,您可能会得到一个空字符串,因为服务器发送了一个空字符串,您可能什么也没有得到,因为服务器没有发送任何消息,或者您可能得到NSNull空值,因为服务器发送了一个空值。这取决于您是否需要对空字符串、空字符串、空字符串和NSNull空值进行不同的处理。

顺便说一句:我一直使用NSDictionary类的一些扩展,例如- ( NSString *)stringForKey,它将返回一个NSString或零,100%保证。如果这样做,所有错误检查都在一个方法中。您可以将NSNumber转换为NSString,或将NSNull转换为零,或将NSDictionary等转换为零,以后再也不用担心了。当然,您需要检查它是否合适。

票数 5
EN

Stack Overflow用户

发布于 2014-12-16 18:02:19

除了其他答案之外,您还可以在将API响应解析为模型对象之前考虑replacing NSNull instances with empty strings。类似地,您可以遍历响应字典的可变副本,并删除其值包含NSNull的键。

基本上,当您得到响应时,先做它,这样您的代码就不会被NSNull检查弄得乱七八糟。

票数 1
EN

Stack Overflow用户

发布于 2020-06-02 20:12:50

另一种处理此问题的方法是使用类别:

代码语言:javascript
复制
@interface NSNull (Utilities)

- (NSString *)stringValue;

@end

@implementation NSNull (Utilities)

- (NSString *)stringValue
{
    return nil;
}

@end

然后简单地说:

代码语言:javascript
复制
[myDictionary[@"key"] stringValue] // returns nil for NSNull values
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27509542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档