কোনও এনএসডেটরিজ বা এনএসমিটেবলড অভিধানে কী রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


456

আমাকে ডিকের কী আছে কিনা তা খতিয়ে দেখা দরকার। কিভাবে?


4
(কেবল এখানে যে কেউ গুগল করছেন। দ্রষ্টব্য যে এটি একটি অতি পুরনো প্রশ্ন Saint নীচে সেন্টম্যাসিনটোশ উত্তরটি শিল্পের রাজ্য, এটি এই কিউএর পাঁচ বছর আগে রয়েছে Hope আশা করি এটি সহায়তা করবে))
ফ্যাটি

1
আসলে, অ্যান্ডি ডেন্টের উত্তরটি শিল্পের অবস্থা এবং আরও প্রসঙ্গ দেয়। এবং এটি সেন্টম্যাকিনটোসের চেয়ে আগে এটি করেছিল। নিজেকে আরও কিছুটা নিচে স্ক্রোল করার পক্ষে করুন।
পিটার কাম্পফ

1
তিনি ব্যবহার করেন: কীস বাইমনেম [পরীক্ষা]! = শূন্য! = নিল চেক অপ্রয়োজনীয় এবং আইএমএইচও কম পঠনযোগ্য। আমি কেবল সিনট্যাক্স খুঁজছেন এমন লোকদের জন্য টিএল; ডিআর সংস্করণটি ভাগ করে নিতে চেয়েছিলাম।
অ্যান্ড্রু হুজ 20

আমি @ সেনটম্যাসিনটোস এর সাথে একমত তার উত্তর অনেক বেশি সংক্ষিপ্ত।
স্টিভ শোয়ার্কজ

যদি আপনি পরীক্ষা করতে চান NSDictionaryযে কোনো একটি কি (অ-নির্দিষ্ট) রয়েছে আপনি ব্যবহার করা উচিত [dictionary allKeys].count == 0যদি countহয় 0কোন কী আছে NSDictionary
আলেকসান্দার আজিজি

উত্তর:


768

objectForKey একটি কী উপস্থিত না থাকলে শূন্য করে ফিরবে।


29
কী কী বিদ্যমান থাকলেও এটির সাথে মানটি শূন্য হয় কি?
ফায়োডর সোইকিন

232
এটা সম্ভব না. আপনি কোনও এনএসডি অভিধানে শূন্য করতে পারবেন না। [NSNull null]পরিবর্তে আপনি ব্যবহার করতে হবে।
ওলে বেগম্যান মায়

10
@ifodor an nsdicationay একটি NSInuthorArgumentException নিক্ষেপ করবে যদি আপনি কোনও শূন্য মান সন্নিবেশ করানোর চেষ্টা করেন, তাই কোনও কী উপস্থিত থাকার ক্ষেত্রে কখনও ঘটবে না, তবে সংশ্লিষ্ট মানটি শূন্য হবে।
ব্র্যাড দ্য অ্যাপ গাই

3
আপনি কি ভ্যালোরফেরিকে ব্যবহার করতে চান না, কারণ এটি প্রয়োজনে অবজেক্টফোকে বলবে?
রাফি খ্যাচাডৌড়িয়ান

6
আপনি কখনই কোনও জেএসএন অভিধানের জন্য ভোরফোরকি ব্যবহার করতে চান না। এর কারণ JSON কী হিসাবে কোনও স্ট্রিং ধারণ করতে পারে । উদাহরণস্বরূপ, যদি এটিতে একটি কী হিসাবে "@ অ্যাকাউন্ট" থাকে, তবে অবজেক্টফোকে: @ "@ @ গণনা" সঠিক মান দেবে, তবে মান ফরফেরকি: @ "@ গণনা" কী / মান জোড়ার সংখ্যা দেবে।
gnasher729

162
if ([[dictionary allKeys] containsObject:key]) {
    // contains key
}

অথবা

if ([dictionary objectForKey:key]) {
    // contains object
}

100
এই উত্তরের উদাহরণটি ধীর।
জেমস ভ্যান বক্সটেল

5
পড়ুন: উদাহরণস্বরূপ এই উত্তরের একটি অবৈধ (ও (এন) ও (1) এর পরিবর্তে) বিবেচনা করা উচিত
হার্টজেল গিনেস

5
কর্মক্ষমতা খুব প্রাসঙ্গিক। এটি খুব সত্য হতে পারে যে এই সঠিক লাইনটি অপ্রাসঙ্গিক, তবে যদি এটি বার বার পুনরাবৃত্তি হতে থাকে তবে হঠাত্ এটির পরিবর্তে হ'ল এন * এম লাগবে এবং আপনার প্রোগ্রামটি কেন ধীর হয়েছে তা আপনি বুঝতে পারবেন না। প্রায় সবই একবারে বা ছোট ক্ষেত্রে দ্রুত হয়। তবে প্রোগ্রামগুলি যেমন ভুল ডেটা কাঠামো ব্যবহার করে বৃদ্ধি পায় (যেমন প্রথম উদাহরণে ডকের পরিবর্তে অ্যারের মতো) আপনার জন্য বড় ব্যয় হবে।
অ্যান্ড্রু হুজ

2
কী (অ) এর অস্তিত্বের জন্য একটি অভিধান (বা সেট) পরীক্ষা করা O (1) এর ও (এন) এর সবচেয়ে খারাপ ক্ষেত্রে প্রত্যাশিত। ও (লগ (এন)) নয়। অ্যাপলের ডকুমেন্টেশনগুলি পরিষ্কারভাবে এটি ব্যাখ্যা করে।
অ্যান্ড্রু হুজ

@ জো ব্লো "থ্রিডি মেকানিম ডটগুলি অ্যানিমেট করুন" বলে মনে হচ্ছে আপনি Unক্য ইঞ্জিন / সি # দিয়ে কোকো টাচ / উদ্দেশ্য- সিকে বিভ্রান্ত করছেন। এটি সত্য যে ইউনিটি ইঞ্জিন এটি চলমান প্ল্যাটফর্মগুলিতে মারাত্মকভাবে অদক্ষ। তবে এটি মোটেও সত্য নয় যে উদ্দেশ্যমূলক-সি / সুইফট অ্যাপ্লিকেশনগুলি সহজাতভাবে অদক্ষ, বা বেশিরভাগ পাকা আইওএস বিকাশকারীরা তাদের কোডটির কার্যকারিতা সম্পর্কে সক্রিয়ভাবে সচেতন নয়। হিসাবে "শুধুমাত্র (4 জীবন্ত) কার্য সম্পাদন প্রোগ্রামারদের প্রাসঙ্গিক" - আপনি পরিষ্কারভাবে একটি খেলা বিকাশকারী না হন। 60FPS ডাব্লু / ও-তে ব্যাটারি হত্যার দুর্দান্ত গ্রাফিক্স এবং গেমপ্লে একটি নিয়মিত চ্যালেঞ্জ।
স্লিপ ডি থম্পসন

98

অবজেক্টিভ-সি এবং ক্ল্যাংয়ের আরও সাম্প্রতিক সংস্করণগুলিতে এর জন্য একটি আধুনিক সিনট্যাক্স রয়েছে:

if (myDictionary[myKey]) {

}

আপনাকে শূন্যের সাথে সমতার জন্য পরীক্ষা করতে হবে না, কারণ কেবল নন-নীল উদ্দেশ্য-সি বস্তু অভিধানে (বা অ্যারে) সংরক্ষণ করা যেতে পারে। এবং সমস্ত অবজেক্টিভ-সি অবজেক্টস সত্যবাদী মান। এমনকি @NO, @0এবং [NSNull null]সত্য হিসাবে মূল্যায়ন করুন।

সম্পাদনা: সুইফ্ট এখন একটি জিনিস।

সুইফ্টের জন্য আপনি নীচের মতো কিছু চেষ্টা করবেন

if let value = myDictionary[myKey] {

}

এই সিনট্যাক্সটি কেবলমাত্র যদি ব্লকটি কার্যকর করে যদি মাইকি ডিকটিতে থাকে এবং যদি তা হয় তবে মানটি ভেরিয়েবলে সঞ্চিত থাকে। নোট করুন যে এটি 0 এর মতো ভুয়া মানগুলির জন্যও কাজ করে।


এর জন্য ধন্যবাদ! আমি কেবল কৌতূহলী, তবে আমি উদ্দেশ্য-সি শ্রেণীর রেফারেন্স বিকাশকারী এ নথিভুক্ত এই আচরণটি খুঁজে পাচ্ছি না le
h ই

2
না তুমি অন্ধ নও এটি জোর দেওয়া হয় না। তবে এখানে (ঝনঝন) এবং এখানে দৃশ্যমান (আধুনিক অবজেক্ট: খুব নীচে) এবং এখানে (সংগ্রহের গাইড: অনুসন্ধান অভিধান)
অ্যান্ড্রু হুজ


9

JSON অভিধান ব্যবহার করার সময়:

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

if( isNull( dict[@"my_key"] ) )
{
    // do stuff
}

8

আপনি ফার্নান্দিসের উত্তরটি পছন্দ করেছেন যদিও আপনি দুবার আপত্তি চেয়েছেন।

এটিও করা উচিত (মার্টিনের এ হিসাবে কম-বেশি একই)।

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 এ কাজ করে


5

একটি খুব কদর্য গ্যাচা যা আমার ডিবাগিংয়ের সময়টি কেবলমাত্র নষ্ট করেছিল - আপনি নিজেকে ব্যবহারের চেষ্টা করে স্বয়ং-সম্পূর্ণরূপে অনুরোধ করতে পারেন 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

5

সুইফ্ট ব্যবহার করে, এটি হবে:

if myDic[KEY] != nil {
    // key exists
}

5

হ্যাঁ. এই জাতীয় ত্রুটিগুলি খুব সাধারণ এবং অ্যাপ ক্রাশের দিকে নিয়ে যায়। সুতরাং আমি নীচে প্রতিটি প্রকল্পে এনএসডি অভিধান যোগ করতে ব্যবহার করি:

//.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"];


3

কারণ শূন্য ফাউন্ডেশন ডেটা স্ট্রাকচারে সংরক্ষণ করা যায় না NSNullকখনও কখনও একটি প্রতিনিধিত্ব করা হয় nil। কারণ NSNullএকটি সিঙ্গলটন অবজেক্ট আপনি NSNullসরাসরি পয়েন্টার তুলনা ব্যবহার করে অভিধানে সঞ্চিত মান কিনা তা পরীক্ষা করে দেখতে পারেন :

if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }

1
যখন আমি এটিকে আমার চাবিটির জন্য NSMutableArray ব্যবহার করলাম তখন কার্যকর হয়নি।
প 12

4
কেন পৃথিবীতে এই উত্সাহ দেওয়া হয়নি? এটা ঠিক সরল ভুল। যদি সিঙ্গেলটন NSNullউদাহরণটি কী হিসাবে মান হিসাবে অভিধানে সঞ্চিত থাকে তবে এই চেকটি সত্য হবে @"myKey"@"myKey"অভিধানে না থাকা কীটি থেকে এটি সম্পূর্ণ আলাদা জিনিস - সত্যই দুটি পারস্পরিক একচেটিয়া।
মার্ক আমেরিকা

যেহেতু এটি এখনও পুরোপুরি ভুল হওয়ার সাথে সাথে পাঁচটি ভোট রয়েছে, তাই আমি কেবল মার্কের কথার পুনরাবৃত্তি করতে পারি: অভিধানে নাল মান সহ একটি কী রয়েছে কিনা তা এই কোডটি পরীক্ষা করে, যা কীটি মোটেই না রেখে সম্পূর্ণ আলাদা।
gnasher729

এটি "সম্পূর্ণ ভুল, তবে আকর্ষণীয় তথ্যের দিকে লক্ষ্য রাখে"
ফ্যাটি

এটি কী করে (ডিক্টে এনএসনুলের জন্য চেক করুন) এবং এটি কী করে না (স্পষ্ট করে একটি ডিকের জন্য একটি মান পরীক্ষা করুন)
এন্ড্রু হুজ

2

দ্রুত 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
}

1

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি অনুসন্ধানের ফলাফলটি একটি অস্থায়ী ভেরিয়েবলে সংরক্ষণ করুন, টেম্প ভেরিয়েবলটি যদি শূন্য থাকে তবে পরীক্ষা করুন। আপনি একই জিনিসটিকে দু'বার উপরে দেখছেন না:

id obj = [dict objectForKey:@"blah"];

if (obj) {
   // use obj
} else {
   // Do something else
}

1

আদিরেল 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;

}


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.