मुझे यह जांचने की आवश्यकता है कि क्या किसी तानाशाह के पास चाबी है या नहीं। कैसे?
NSDictionary
किसी भी कुंजी (गैर विशिष्ट) शामिल हैं का उपयोग करना चाहिए [dictionary allKeys].count == 0
तो count
है 0
में कोई भी कुंजी देखते हैं NSDictionary
।
मुझे यह जांचने की आवश्यकता है कि क्या किसी तानाशाह के पास चाबी है या नहीं। कैसे?
NSDictionary
किसी भी कुंजी (गैर विशिष्ट) शामिल हैं का उपयोग करना चाहिए [dictionary allKeys].count == 0
तो count
है 0
में कोई भी कुंजी देखते हैं NSDictionary
।
जवाबों:
objectForKey
यदि कोई कुंजी मौजूद नहीं है, तो nil वापस आएगा।
[NSNull null]
इसके बजाय उपयोग करना होगा ।
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
या
if ([dictionary objectForKey:key]) {
// contains object
}
उद्देश्य-सी और क्लैंग के हाल के संस्करणों में इसके लिए एक आधुनिक वाक्यविन्यास है:
if (myDictionary[myKey]) {
}
आपको नील के साथ समानता की जांच करने की आवश्यकता नहीं है, क्योंकि केवल गैर-शून्य ऑब्जेक्ट-सी ऑब्जेक्ट को शब्दकोशों (या सरणियों) में संग्रहीत किया जा सकता है। और सभी Objective-C ऑब्जेक्ट्स सत्य मान हैं। यहां तक कि @NO
, @0
और [NSNull null]
सच के रूप में मूल्यांकन करें।
संपादित करें: स्विफ्ट अब एक बात है।
स्विफ्ट के लिए आप कुछ इस तरह की कोशिश करेंगे
if let value = myDictionary[myKey] {
}
यह सिंटैक्स केवल तभी निष्पादित करेगा यदि myKey तानाशाही में है और यदि है तो मान वैरिएबल में संग्रहीत है। ध्यान दें कि यह 0 की तरह भी गलत मूल्यों के लिए काम करता है।
if ([mydict objectForKey:@"mykey"]) {
// key exists.
}
else
{
// ...
}
मुझे फ़र्नांडिस का जवाब पसंद है, भले ही आप दो बार ओब्जेक्ट मांगते हैं।
यह भी (कमोबेश मार्टिन ए के समान) करना चाहिए।
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
}
मार्टिन और यह दोनों iPad2 iOS 5.0.1 9A405 पर काम करते हैं
एक बहुत बुरा गच्चा, जिसने मेरा थोड़ा सा समय बर्बाद कर दिया - आपको doesContain
लगता है कि जो काम करने लगता है उसका उपयोग करने के लिए स्वयं को पूरा करने के लिए प्रेरित किया जा सकता है ।
सिवाय इसके, अगर आप स्ट्रिंग कुंजियों के साथ एक शब्दकोश doesContain
है, 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
हाँ। इस तरह की त्रुटियां बहुत आम हैं और ऐप क्रैश की ओर ले जाती हैं। इसलिए मैं नीचे के रूप में प्रत्येक परियोजना में एनएसडॉर जोड़ने का उपयोग करता हूं:
//.h फ़ाइल कोड:
@interface NSDictionary (AppDictionary)
- (id)objectForKeyNotNull : (id)key;
@end
//.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
कोड में आप नीचे के रूप में उपयोग कर सकते हैं:
NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
NS मंद में कुंजी के अस्तित्व की जाँच के लिए:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
क्योंकि nil को फाउंडेशन डेटा स्ट्रक्चर्स में संग्रहित नहीं किया जा सकता NSNull
है nil
। क्योंकि NSNull
एक सिंगलटन ऑब्जेक्ट है जिसे आप यह देखने के लिए देख सकते हैं कि NSNull
क्या डायरेक्ट पॉइंटर तुलना का उपयोग करके शब्दकोश में संग्रहीत मूल्य है:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
NSNull
कुंजी में एकलांक उदाहरण को शब्दकोष में संग्रहीत किया गया है @"myKey"
। यह @"myKey"
शब्दकोष में नहीं होने की कुंजी के लिए एक पूरी तरह से अलग बात है - वास्तव में दोनों परस्पर अनन्य हैं।
स्विफ्ट 4.2 के लिए समाधान
इसलिए, यदि आप इस प्रश्न का उत्तर देना चाहते हैं कि क्या शब्दकोश में कुंजी है, तो पूछें:
let keyExists = dict[key] != nil
यदि आप मूल्य चाहते हैं और आपको पता है कि शब्दकोश में कुंजी है, तो कहें:
let val = dict[key]!
लेकिन अगर, जैसा कि आमतौर पर होता है, आप नहीं जानते कि इसमें कुंजी है - आप इसे लाना चाहते हैं और इसका उपयोग करना चाहते हैं, लेकिन केवल अगर यह मौजूद है - तो कुछ का उपयोग करें if let
:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
जैसा कि आदिराएल ने objectForKey
प्रमुख अस्तित्व की जांच करने का सुझाव दिया था, लेकिन जब आप अशक्त objectForKey
शब्दकोश में कहते हैं , तो ऐप क्रैश हो जाता है इसलिए मैंने इसे निम्नलिखित तरीके से निर्धारित किया है।
- (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"
}