Adi*_*ael 762

objectForKey 如果密钥不存在,则返回nil.

  • 那是不可能的.您不能将nil添加到NSDictionary.您将不得不使用`[NSNull null]`. (232认同)
  • 如果密钥确实存在,但它的相应值是否为零呢? (29认同)
  • @fyodor如果你试图插入一个nil值,nsdictionay将抛出一个NSInvalidArgumentException,所以永远不应该存在一个键存在的情况,但相应的值是nil. (10认同)
  • 绝对不要永远想要将valueForKey用于JSON字典.那是因为JSON可以包含_any_ string作为键.例如,如果它包含"@count"作为键,则objectForKey:@"@ count"将给出正确的值,但valueForKey:@"@ count"将给出键/值对的数量. (6认同)
  • 你不想使用valueForKey,因为如果有必要,会调用objectForKey吗? (3认同)

Ale*_*iks 162

if ([[dictionary allKeys] containsObject:key]) {
    // contains key
}
Run Code Online (Sandbox Code Playgroud)

要么

if ([dictionary objectForKey:key]) {
    // contains object
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案中的例子1很慢. (99认同)
  • 阅读:此答案中的示例一应被视为非法(O(n)而非O(1)) (5认同)
  • 表现非常相关.这条确切的线路可能是无关紧要的,但是如果它会重复n次,那么突然间而不是花费n次时间来取n*m并且你无法弄清楚为什么你的程序很慢.几乎所有东西都是快速的一次或小的情况.但是,随着程序使用错误的数据结构(如第一个例子中的数组而不是dict)的增长,最终会让你付出沉重的代价. (5认同)
  • 检查字典(或集合)是否存在密钥是O(1),最坏情况是O(n).不是O(log(n)).Apple的文档清楚地解释了这一点. (2认同)

And*_*oos 98

更新的Objective-C和Clang版本具有现代语法:

if (myDictionary[myKey]) {

}
Run Code Online (Sandbox Code Playgroud)

您不必检查与nil的相等性,因为只有非零的Objective-C对象可以存储在字典(或数组)中.并且所有Objective-C对象都是真实的值.甚至@NO,@0[NSNull null]评估为真.

编辑:斯威夫特现在是一个东西.

对于Swift,你会尝试类似下面的内容

if let value = myDictionary[myKey] {

}
Run Code Online (Sandbox Code Playgroud)

如果myKey在dict中,则此语法仅执行if块,如果是,则将值存储在value变量中.请注意,这适用于0等虚假值.

  • 不,你不是盲人.没有强调.但可见[here](http://clang.llvm.org/docs/ObjectiveCLiterals.html)(clang)和[here](https://developer.apple.com/library/ios/releasenotes/ObjectiveC/ModernizationObjC/采用现代目标-C /采用现代目标-Chtml)(现代对象:非常底部)和[这里](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html) (收藏指南:搜索词典) (2认同)

Chr*_*heD 22

if ([mydict objectForKey:@"mykey"]) {
    // key exists.
}
else
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)


Rat*_*ata 9

使用JSON词典时:

#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]

if( isNull( dict[@"my_key"] ) )
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)


q23*_*950 8

我喜欢费尔南德斯的答案,即使你要求两次obj.

这也应该做(或多或少与马丁的A相同).

id obj;

if ((obj=[dict objectForKey:@"blah"])) {
   // use obj
} else {
   // Do something else like creating the obj and add the kv pair to the dict
}
Run Code Online (Sandbox Code Playgroud)

Martin和这个答案都适用于iPad2 iOS 5.0.1 9A405


小智 5

是.这种错误很常见,导致应用程序崩溃.所以我用它在每个项目中添加NSDictionary,如下所示:

//.h文件代码:

@interface NSDictionary (AppDictionary)

- (id)objectForKeyNotNull : (id)key;

@end
Run Code Online (Sandbox Code Playgroud)

//.m文件代码如下

#import "NSDictionary+WKDictionary.h"

@implementation NSDictionary (WKDictionary)

 - (id)objectForKeyNotNull:(id)key {

    id object = [self objectForKey:key];
    if (object == [NSNull null])
     return nil;

    return object;
 }

@end
Run Code Online (Sandbox Code Playgroud)

在代码中,您可以使用如下:

NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
Run Code Online (Sandbox Code Playgroud)


And*_*ent 5

一个非常讨厌的问题,只是浪费了我的一些时间调试 - 你可能会发现自己提示自动完成尝试使用doesContain似乎工作.

除了doesContain使用id比较而不是使用的哈希比较,objectForKey如果你有一个带字符串键的字典,它将返回NO给a doesContain.

NSMutableDictionary* keysByName = [[NSMutableDictionary alloc] init];
keysByName[@"fred"] = @1;
NSString* test = @"fred";

if ([keysByName objectForKey:test] != nil)
    NSLog(@"\nit works for key lookups");  // OK
else
    NSLog(@"\nsod it");

if (keysByName[test] != nil)
    NSLog(@"\nit works for key lookups using indexed syntax");  // OK
else
    NSLog(@"\nsod it");

if ([keysByName doesContain:@"fred"])
    NSLog(@"\n doesContain works literally");
else
    NSLog(@"\nsod it");  // this one fails because of id comparison used by doesContain
Run Code Online (Sandbox Code Playgroud)


rsc*_*rsc 5

使用Swift,它将是:

if myDic[KEY] != nil {
    // key exists
}
Run Code Online (Sandbox Code Playgroud)