首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查NSDictionary中是否存在密钥为空

检查NSDictionary中是否存在密钥为空
EN

Stack Overflow用户
提问于 2011-08-12 03:28:31
回答 13查看 56.4K关注 0票数 17

我确实搜索了一下如何检查NSDictionary密钥是否存在,并提出了解决方案。但它仍然抛出一个错误,告诉我向键添加空值。我不确定我的代码是否正确。如果任何人对此有任何想法可以帮助我。

代码语言:javascript
复制
NSDictionary *result;
id myImageURL = [result objectForKey:@"url"];
if ((NSNull *)myImageURL == [NSNull null])
    myImageURL = @"";

id myImage = [result objectForKey:@"image"];
if ((NSNull *)myImage == [NSNull null])
    myImage = @"";

检查是否为空,不添加任何内容,如果不为空,则添加值。但它仍然给我一个错误,我不知道为什么。

代码语言:javascript
复制
/****OUTPUT*****/

2011-08-11 14:56:06.668 Tab_Table_Win[6510:207] RESULTS : {
image = "<UIImage: 0xbc332c0>";
url = "http://a3.twimg.com/profile_images/999228511/normal.jpg";
}

2011-08-11 14:56:06.669 Tab_Table_Win[6510:207] url : http://a3.twimg.com/profile_images/999228511/normal.jpg
2011-08-11 14:56:06.670 Tab_Table_Win[6510:207] IMage : <UIImage: 0xbc332c0>

/*****Breaks Here ***/

2011-08-11 14:56:06.876 Tab_Table_Win[6510:207] RESULTS : {
}
2011-08-11 14:56:06.878 Tab_Table_Win[6510:207] url : (null)
2011-08-11 14:56:06.879 Tab_Table_Win[6510:207] IMage : (null)
2011-08-11 14:56:06.881 Tab_Table_Win[6510:207] *** Terminating app due to uncaught    exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key'
EN

回答 13

Stack Overflow用户

发布于 2011-08-12 04:16:48

正确答案是:

代码语言:javascript
复制
NSDictionary *result;
NSURL *myImageURL = [result objectForKey:@"url"];
UIImage *myImage = [result objectForKey:@"image"];

/**** Correct way ****/
if (myImageURL != nil && myImage != nil) {
    [images setObject:myImage forKey:myImageURL];
}

谢谢你的解释。

票数 14
EN

Stack Overflow用户

发布于 2014-10-03 23:56:24

汤米完美地解释了这一点。

我建议创建一个NSDictionary类的扩展,如下所示:

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface NSDictionary (Safety)

- (id)safeObjectForKey:(id)aKey;

@end

和实现文件:

代码语言:javascript
复制
#import "NSDictionary+Safety.h"

@implementation NSDictionary (Safety)

- (id)safeObjectForKey:(id)aKey {
  NSObject *object = self[aKey];

  if (object == [NSNull null]) {
    return nil;
  }

  return object;
}

@end

而不是在代码中使用[dictionary objectForKey:@"keyName"];,而是使用

代码语言:javascript
复制
[dictionary safeObjectForKey:@"keyName"];

这样,正如Tommy解释的那样,您将向nil发送一个方法调用,这不会使应用程序崩溃,但您的对象将获得nil值。

希望这能有所帮助。

票数 14
EN

Stack Overflow用户

发布于 2011-08-12 03:51:46

每当我尝试检查从字典返回的对象是否为空时,我都会这样做:

代码语言:javascript
复制
id obj = [myDictionary objectForKey:entityKeyName];
if (obj == [NSNull null]) {
    // do something 
}

那么在你的代码中,它应该是:

代码语言:javascript
复制
NSDictionary *result;
NSString *myImageURL = [result objectForKey:@"url"];
if (myImageURL == [NSNull null])
     myImageURL = @"";

这就是我在你的代码中要做的。

另外,只是确认一下,是否定义了NSDictionary结果?在您的代码中,它没有设置任何内容。它只是被定义为您计划使用调用的结果的变量

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7031688

复制
相关文章

相似问题

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