Bir diksiyonun bir anahtarı olup olmadığını kontrol etmem gerekiyor. Nasıl?
NSDictionary
herhangi bir tuşa (spesifik olmayan) içeren kullanmanız gereken [dictionary allKeys].count == 0
varsa count
olduğunu 0
hiçbir anahtar vardır NSDictionary
.
Bir diksiyonun bir anahtarı olup olmadığını kontrol etmem gerekiyor. Nasıl?
NSDictionary
herhangi bir tuşa (spesifik olmayan) içeren kullanmanız gereken [dictionary allKeys].count == 0
varsa count
olduğunu 0
hiçbir anahtar vardır NSDictionary
.
Yanıtlar:
objectForKey
bir anahtar yoksa sıfır döndürür.
[NSNull null]
yerine kullanmak zorunda kalacaksınız.
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
veya
if ([dictionary objectForKey:key]) {
// contains object
}
Objective-C ve Clang'ın daha yeni sürümleri bunun için modern bir sözdizimine sahiptir:
if (myDictionary[myKey]) {
}
Nil ile eşitliği kontrol etmek zorunda değilsiniz, çünkü sözlüklerde (veya dizilerde) sadece nil olmayan Objective-C nesneleri saklanabilir. Ve tüm Objective-C nesneleri gerçek değerlerdir. Hatta @NO
,, @0
ve [NSNull null]
doğru olarak değerlendir.
Edit: Swift artık bir şey.
Swift için aşağıdakine benzer bir şey denersiniz
if let value = myDictionary[myKey] {
}
Bu sözdizimi yalnızca, myKey dict'te ise ve öyleyse değer value değişkeninde saklanırsa if bloğunu yürütür. Bunun 0 gibi çift değerler için de işe yaradığını unutmayın.
if ([mydict objectForKey:@"mykey"]) {
// key exists.
}
else
{
// ...
}
JSON sözlüklerini kullanırken:
#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]
if( isNull( dict[@"my_key"] ) )
{
// do stuff
}
İki kez obj isteseniz de Fernandes'nin cevabını seviyorum.
Bu da yapmalıdır (Martin A ile aşağı yukarı aynı).
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
}
Martin ve bu cevap her ikisi de iPad2 iOS 5.0.1 9A405'te çalışıyor
Sadece biraz hata ayıklama zamanını boşa harcanan çok kötü bir gotcha - kendinizi doesContain
işe yarar görünüyor kullanmayı denemek için otomatik tamamlandı tarafından istenebilir bulabilirsiniz .
Dışında, doesContain
tarafından kullanılan karma karşılaştırması yerine bir kimlik karşılaştırması kullanır, bu objectForKey
nedenle dize tuşlarına sahip bir sözlüğünüz varsa, NO değerine a döndürür 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
Evet. Bu tür hatalar çok yaygındır ve uygulama kilitlenmesine yol açar. Bu yüzden aşağıdaki gibi her projeye NSDictionary eklemek için kullanın:
//.h dosya kodu:
@interface NSDictionary (AppDictionary)
- (id)objectForKeyNotNull : (id)key;
@end
//.m dosya kodu aşağıdaki gibidir
#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
Kodda aşağıdaki gibi kullanabilirsiniz:
NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
NSDictionary anahtarının varlığını kontrol etmek için:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
Nil, Vakıf veri yapılarında saklanamayacağı NSNull
için bazen a nil
. Tek NSNull
bir nesne olduğundan NSNull
, doğrudan işaretçi karşılaştırmasını kullanarak sözlükte saklanan değerin olup olmadığını kontrol edebilirsiniz :
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
NSNull
örneği sözlükte anahtarın değeri olarak saklandıysa bu denetim true değerini döndürür @"myKey"
. Bu @"myKey"
, sözlükte olmamak için anahtardan tamamen farklı bir şeydir - aslında ikisi birbirini dışlar.
Hızlı 4.2 için çözüm
Dolayısıyla, sözlüğün anahtarı içerip içermediğini soruyu yanıtlamak istiyorsanız, şunu sorun:
let keyExists = dict[key] != nil
Değeri istiyorsanız ve sözlüğün anahtarı içerdiğini biliyorsanız şunu söyleyin:
let val = dict[key]!
Ancak, genellikle olduğu gibi, anahtarın içerdiğini bilmiyorsanız - onu almak ve kullanmak istiyorsunuz, ancak sadece varsa - o zaman şöyle bir şey kullanın if let
:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
Adirael'in objectForKey
anahtar varlığını kontrol etmesini önerdiği gibi objectForKey
nullable sözlükte aradığınızda , uygulama çöküyor , bu yüzden bunu aşağıdaki yoldan çözdüm .
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;
if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;
}
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}