我須要檢查dict是否有密鑰。 怎麼樣? 數組
是。 這種錯誤很常見,致使應用程序崩潰。 因此我用它在每一個項目中添加NSDictionary,以下所示: this
//.h文件代碼: spa
@interface NSDictionary (AppDictionary) - (id)objectForKeyNotNull : (id)key; @end
//.m文件代碼以下 .net
#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
在代碼中,您可使用以下: 調試
NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
一個很是討厭的問題,只是浪費了個人一些時間調試 - 你可能會發現本身提示自動完成嘗試使用彷佛工做的doesContain
。 code
除此以外, doesContain
使用一個ID比較,而不是使用哈希比較objectForKey
因此,若是你有字符串鍵的字典將返回NO的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
更新的Objective-C和Clang版本具備現代語法: 字符串
if (myDictionary[myKey]) { }
您沒必要檢查與nil的相等性,由於只有非零的Objective-C對象能夠存儲在字典(或數組)中。 而且全部Objective-C對象都是真實的值。 甚至@0
@NO
, @0
和[NSNull null]
評估爲true。 get
編輯:斯威夫特如今是一個東西。 it
對於Swift,你會嘗試相似下面的內容
if let value = myDictionary[myKey] { }
若是myKey在dict中,則此語法僅執行if塊,若是是,則將值存儲在value變量中。 請注意,這適用於0等虛假值。
使用Swift,它將是:
if myDic[KEY] != nil { // key exists }
若是密鑰不存在, objectForKey
將返回nil。