আমাকে ডিকের কী আছে কিনা তা খতিয়ে দেখা দরকার। কিভাবে?
NSDictionary
যে কোনো একটি কি (অ-নির্দিষ্ট) রয়েছে আপনি ব্যবহার করা উচিত [dictionary allKeys].count == 0
যদি count
হয় 0
কোন কী আছে NSDictionary
।
আমাকে ডিকের কী আছে কিনা তা খতিয়ে দেখা দরকার। কিভাবে?
NSDictionary
যে কোনো একটি কি (অ-নির্দিষ্ট) রয়েছে আপনি ব্যবহার করা উচিত [dictionary allKeys].count == 0
যদি count
হয় 0
কোন কী আছে NSDictionary
।
উত্তর:
objectForKey
একটি কী উপস্থিত না থাকলে শূন্য করে ফিরবে।
[NSNull null]
পরিবর্তে আপনি ব্যবহার করতে হবে।
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
অথবা
if ([dictionary objectForKey:key]) {
// contains object
}
অবজেক্টিভ-সি এবং ক্ল্যাংয়ের আরও সাম্প্রতিক সংস্করণগুলিতে এর জন্য একটি আধুনিক সিনট্যাক্স রয়েছে:
if (myDictionary[myKey]) {
}
আপনাকে শূন্যের সাথে সমতার জন্য পরীক্ষা করতে হবে না, কারণ কেবল নন-নীল উদ্দেশ্য-সি বস্তু অভিধানে (বা অ্যারে) সংরক্ষণ করা যেতে পারে। এবং সমস্ত অবজেক্টিভ-সি অবজেক্টস সত্যবাদী মান। এমনকি @NO
, @0
এবং [NSNull null]
সত্য হিসাবে মূল্যায়ন করুন।
সম্পাদনা: সুইফ্ট এখন একটি জিনিস।
সুইফ্টের জন্য আপনি নীচের মতো কিছু চেষ্টা করবেন
if let value = myDictionary[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
}
মার্টিন এবং এই উত্তর উভয়ই আইপ্যাড 2 আইওএস 5.0.1 9A405 এ কাজ করে
একটি খুব কদর্য গ্যাচা যা আমার ডিবাগিংয়ের সময়টি কেবলমাত্র নষ্ট করেছিল - আপনি নিজেকে ব্যবহারের চেষ্টা করে স্বয়ং-সম্পূর্ণরূপে অনুরোধ করতে পারেন doesContain
কাজটি বলে মনে হচ্ছে এমন পারেন।
বাদে, doesContain
আইডি তুলনাটি ব্যবহার করে হ্যাশ তুলনাটি ব্যবহার করে যার objectForKey
ফলে স্ট্রিং কীগুলির সাথে আপনার যদি একটি অভিধান থাকে তবে এটি কোনওটিতে কোনও উত্তর দেয় না 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"];
এনএসডি অভিধানে কীটির অস্তিত্ব পরীক্ষা করার জন্য:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
কারণ শূন্য ফাউন্ডেশন ডেটা স্ট্রাকচারে সংরক্ষণ করা যায় না 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"
}