যদি আপনি অবজেক্টএটিআইএনডেক্সের সাথে কোনও জিনিস পেতে না পারেন: একটি এনএসএসেট থেকে তাহলে আপনি কীভাবে অবজেক্টগুলি পুনরুদ্ধার করবেন?
উত্তর:
একটি সেট জন্য বেশ কয়েকটি ব্যবহারের কেস আছে। আপনি (যেমন enumerateObjectsUsingBlock
বা NSFastEnumeration সহ) মাধ্যমে গণনা করতে containsObject
পারেন, সদস্যতার জন্য পরীক্ষা করার জন্য কল করতে পারেন, anyObject
সদস্য পেতে (এলোমেলো নয়) ব্যবহার করতে পারেন, বা এটিকে একটি অ্যারেতে (কোনও নির্দিষ্ট ক্রমে নয়) রূপান্তর করতে পারেন allObjects
।
যখন আপনি সদৃশ চান না, অর্ডারের বিষয়ে চিন্তা করেন না এবং দ্রুত সদস্যপদ পরীক্ষা করতে চান তখন একটি সেট উপযুক্ত।
member:
বার্তা প্রেরণ করে একটি পরিচিত বস্তুর সন্ধান করতে পারেন । যদি এটি ফিরে আসে nil
তবে সেটটিতে আপনি যে পাস করেছেন তার সমান কোনও অবজেক্ট থাকে না; যদি এটি কোনও অবজেক্ট পয়েন্টারটি দেয়, তবে যে পয়েন্টারটি এটি ফিরে আসে সেটি সেটটিতে ইতিমধ্যে রয়েছে। সেট বস্তু বাস্তবায়ন করতে হবে hash
এবং isEqual:
এই জন্য উপযোগী হতে হবে।
hash
চাহিদা বাস্তবায়িত হবে; আপনি যদি এটি করেন তবে এটি কেবল অনেক দ্রুত যেতে পারে।
hash
এনএসবজেক্ট প্রোটোকলের ডকুমেন্টেশন থেকে : "যদি দুটি বিষয় সমান হয় ( isEqual:
পদ্ধতি অনুসারে নির্ধারিত হয় ), তাদের অবশ্যই হ্যাশ মান একই হতে হবে।" বর্তমানে, এনএসবজেক্টের প্রয়োগ hash
এবং isEqual:
অবজেক্টের পরিচয় (ঠিকানা) ব্যবহার করুন। আপনি যদি ওভাররাইড করে থাকেন তবে আপনি isEqual:
এমন বস্তুগুলির সম্ভাবনা সেট করছেন যা অভিন্ন নয় তবে সমান — যা আপনি যদি ওভাররাইড না করেন hash
তবে এখনও বিভিন্ন হ্যাশ থাকবে। এটি সমান বস্তুর সমান হ্যাশগুলির প্রয়োজনীয়তা লঙ্ঘন করে।
member:
, ধারক শুধু তাই এক দেখবে বালতি (এই কারণেই সদস্যপদ পরীক্ষায় অ্যারেগুলির তুলনায় সেটগুলি এত বেশি দ্রুত এবং অভিধান-কী কী-মূল্য অনুসন্ধানে সমান্তরাল অ্যারের তুলনায় অনেক দ্রুত হয়)। যদি অনুসন্ধান করা বস্তুর ভুল হ্যাশ থাকে তবে ধারকটি ভুল বালতিতে দেখবে এবং কোনও মিল খুঁজে পাবে না।
-[NSObject hash]
0 ছিল That এটি অনেক কিছুই ব্যাখ্যা করে। = এস
এনএসএসেটের কোনও পদ্ধতি অবজেক্টঅ্যান্টেক্স নেই:
AllObjects কে কল করার চেষ্টা করুন যা সমস্ত বস্তুর NSArray দেয়।
আপনার প্রয়োজনীয় অবজেক্টটি নির্বাচন করতে যদি কোনও ধরণের অনন্য শনাক্তকারী থাকে তবে ফিল্টারসেটসৌসিংপ্রেডিকেট ব্যবহার করা সম্ভব।
প্রথমে প্রিকিট তৈরি করুন (অবজেক্টটিতে আপনার অনন্য আইডি ধরে ধরে "সনাক্তকারী" বলা হয় এবং এটি একটি এনএসএস স্ট্রিং):
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"identifier == %@", identifier];
এবং তারপরে প্রিডিকেট ব্যবহার করে অবজেক্টটি চয়ন করুন:
NSObject *myChosenObject = [mySet filteredSetUsingPredicate:myPredicate].anyObject;
সুইফট 3 এবং আইওএস 10 এর জন্য:
//your current set
let mySet : NSSet
//targetted index
let index : Int
//get object in set at index
let object = mySet.allObjects[index]
এনএসএসেটটি হল একুয়াল পদ্ধতিটি ব্যবহার করে: (যেটি আপনি সেই সেটে রেখেছেন সেগুলি অবশ্যই ওভাররাইড করতে হবে, উপরন্তু, হ্যাশ পদ্ধতিটি) কোনও বস্তুর ভিতরে রয়েছে কিনা তা নির্ধারণ করতে।
সুতরাং, উদাহরণস্বরূপ যদি আপনার কাছে এমন কোনও ডেটা মডেল থাকে যা একটি আইডি মান দ্বারা এর স্বতন্ত্রতাটি সংজ্ঞায়িত করে (সম্পত্তিটি বলে:
@property NSUInteger objectID;
তাহলে আপনি ইস্কুল: বাস্তবায়ন করতেন
- (BOOL)isEqual:(id)object
{
return (self.objectID == [object objectID]);
}
এবং আপনি হ্যাশ প্রয়োগ করতে পারে:
- (NSUInteger)hash
{
return self.objectID; // to be honest, I just do what Apple tells me to here
// because I've forgotten how Sets are implemented under the hood
}
তারপরে, আপনি সেই আইডি সহ একটি বস্তু পেতে পারেন (পাশাপাশি এটি এনএসএসেটে রয়েছে কিনা তা পরীক্ষা করে দেখুন):
MyObject *testObject = [[MyObject alloc] init];
testObject.objectID = 5; // for example.
// I presume your object has more properties which you don't need to set here
// because it's objectID that defines uniqueness (see isEqual: above)
MyObject *existingObject = [mySet member: testObject];
// now you've either got it or existingObject is nil
তবে হ্যাঁ, এনএসএসেট থেকে কিছু পাওয়ার একমাত্র উপায় হ'ল এটি বিবেচনা করা যা এটি তার স্বতন্ত্রতাটিকে প্রথম স্থানে সংজ্ঞায়িত করে।
আমি কী দ্রুত তা পরীক্ষা করেছি না, তবে আমি গণনাটি ব্যবহার করা এড়াচ্ছি কারণ এটি সদস্যের ব্যবহারের ক্ষেত্রে লিনিয়ার হতে পারে: পদ্ধতিটি আরও দ্রুত হবে। এটি এনএসআরির পরিবর্তে এনএসএসেটের ব্যবহারকে প্রাধান্য দেওয়ার অন্যতম কারণ।
for (id currentElement in mySet)
{
// ** some actions with currentElement
}
বেশিরভাগ সময় আপনি সেট থেকে একটি নির্দিষ্ট অবজেক্ট পাওয়ার বিষয়ে চিন্তা করেন না। কোনও সেটে কোনও বস্তু রয়েছে কিনা তা পরীক্ষা করার বিষয়ে আপনার যত্নশীল। সেটাই সেটগুলির জন্য ভাল। যখন আপনি দেখতে চান যে কোনও বস্তু কোনও সংগ্রহের সেটে রয়েছে সেগুলি অ্যারের তুলনায় অনেক দ্রুত।
আপনি কোন বস্তুটি পেয়েছেন সে সম্পর্কে যদি চিন্তা না -anyObject
করেন তবে সেট থেকে কেবল একটি জিনিস দেবে যেমন ব্যবহার করুন, ব্যাগের মধ্যে হাত রাখার এবং কোনও জিনিস ধরার মতো।
Dog *aDog = [dogs anyObject]; // dogs is an NSSet of Dog objects
আপনি কী কী বস্তু পাবেন সে সম্পর্কে যদি যত্নশীল হন -member
তবে আপনাকে ব্যবহার করে যা আপনাকে সেই বস্তুটি ফিরিয়ে দেয় বা সেটে না থাকলে শূন্য করে। কল করার আগে আপনার কাছে ইতিমধ্যে এটি থাকা উচিত।
Dog *spot = [Dog dogWithName:@"Spot"];
// ...
Dog *aDog = [dogs member:spot]; // Returns the same object as above
আরও কিছু বুঝতে আপনি এখানে কোড কোড চালিয়ে যেতে পারেন
NSString *one = @"One";
NSString *two = @"Two";
NSString *three = @"Three";
NSSet *set = [NSSet setWithObjects:one, two, three, nil];
// Can't use Objective-C literals to create a set.
// Incompatible pointer types initializing 'NSSet *' with an expression of type 'NSArray *'
// NSSet *set = @[one, two, three];
NSLog(@"Set: %@", set);
// Prints looking just like an array but is actually not in any order
//Set: {(
// One,
// Two,
// Three
// )}
// Get a random object
NSString *random = [set anyObject];
NSLog(@"Random: %@", random); // Random: One
// Iterate through objects. Again, although it prints in order, the order is a lie
for (NSString *aString in set) {
NSLog(@"A String: %@", aString);
}
// Get an array from the set
NSArray *array = [set allObjects];
NSLog(@"Array: %@", array);
// Check for an object
if ([set containsObject:two]) {
NSLog(@"Set contains two");
}
// Check whether a set contains an object and return that object if it does (nil if not)
NSString *aTwo = [set member:two];
if (aTwo) {
NSLog(@"Set contains: %@", aTwo);
}
[[nsSetObjects allObjects] objectAtIndex: anyInteger]