检查NSDictionary中是否存在密钥为null

lif*_*son 14 iphone objective-c nsdictionary nsstring

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

NSDictionary *result;
id myImageURL = [result objectForKey:@"url"];
if ((NSNull *)myImageURL == [NSNull null])
    myImageURL = @"";

id myImage = [result objectForKey:@"image"];
if ((NSNull *)myImage == [NSNull null])
    myImage = @"";
Run Code Online (Sandbox Code Playgroud)

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

/****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'
Run Code Online (Sandbox Code Playgroud)

lif*_*son 14

正确的答案是:

NSDictionary *result;
NSURL *myImageURL = [result objectForKey:@"url"];
UIImage *myImage = [result objectForKey:@"image"];

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

谢谢你的所有解释.

  • 你能解释一下吗? (2认同)

C0D*_*0D3 14

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

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

#import <Foundation/Foundation.h>

@interface NSDictionary (Safety)

- (id)safeObjectForKey:(id)aKey;

@end
Run Code Online (Sandbox Code Playgroud)

和实施文件:

#import "NSDictionary+Safety.h"

@implementation NSDictionary (Safety)

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

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

  return object;
}

@end
Run Code Online (Sandbox Code Playgroud)

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

[dictionary safeObjectForKey:@"keyName"];
Run Code Online (Sandbox Code Playgroud)

这样,正如Tommy所解释的那样,你将向nil发送一个方法调用,它不会使应用程序崩溃,但你的对象会得到一个零值.

希望这可以帮助.


Yun*_*hel 7

以下答案对我有用:

/sf/answers/194927281/

if ([dictionary objectForKey:key]) {
    // previously stored data for "key"
}
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以使用字典获取字典中的数组

[dictionary allKeys]
Run Code Online (Sandbox Code Playgroud)


ser*_*enn 6

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

id obj = [myDictionary objectForKey:entityKeyName];
if (obj == [NSNull null]) {
    // do something 
}
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中,它将是:

NSDictionary *result;
NSString *myImageURL = [result objectForKey:@"url"];
if (myImageURL == [NSNull null])
     myImageURL = @"";
Run Code Online (Sandbox Code Playgroud)

这就是我在你的代码中所做的.

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


Bil*_*ess 2

NSDictionary *result;
NSString *myImageURL = [result objectForKey:@"url"];
if (myImageURL == NULL)
    myImageURL = @"";

NSString *myImage = [result objectForKey:@"image"];
if (myImageURL == NULL)
    myImage = @"";
Run Code Online (Sandbox Code Playgroud)

看看这是否有效,而不是过度考虑 NULL 类。