অবজেক্টিভ-সি-তে আমি কীভাবে বস্তুর প্রকারটি পরীক্ষা করব?


557

আমি পরীক্ষা প্রয়োজন কিনা বস্তুর ধরনের হয় NSStringবা UIImageView। আমি কীভাবে এটি সম্পাদন করতে পারি? কিছু "আইসোফাইপ" পদ্ধতি আছে?


32
হ্যাঁ রয়েছে:[object isKindOfClass:[ClassName class]]
ফিলিপ লেবার্ট

উত্তর:


880

যদি আপনার অবজেক্টটি হয় myObjectএবং আপনি এটি পরীক্ষা করে দেখতে চান এটি একটি কিনা NSString, কোডটি হবে:

[myObject isKindOfClass:[NSString class]]

তেমনিভাবে, আপনি যদি myObjectএকটি পরীক্ষা করতে চান UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
মনে রাখবেন যে এখানে একটিMemberOfClass রয়েছে: পদ্ধতি যা ক্লাসের জন্য পরীক্ষা করবে "নির্ভুলতা"। যদিও এর সাথে সাবধানতা অবলম্বন করুন, যেমন অনেক অ্যাপল বস্তুগুলি প্রকৃত ছদ্মবেশে মূল ফাউন্ডেশন ধরণের। (উদাহরণস্বরূপ, একটি এনএসএসস্ট্রিং প্রায়শই একটি এনএসসিএফএসআর স্ট্রিং হয়, এবং এই মেম্বার অফক্লাস: এই তুলনা করার জন্য মিথ্যা প্রত্যাবর্তন করবে))
ক্রেগ ওটিস

3
নোট করুন এই পদ্ধতিটি খুব ধীর!
সাক্রিস্ট

এনএসএসটিরিং একটি ক্লাস ক্লাস্টার তা জেনে রাখা কি সঠিক? (এনএসএনবারের মতো)
রিকার্ডো

52

আপনি সম্ভবত ব্যবহার করতে হবে

- (BOOL)isKindOfClass:(Class)aClass

এটি একটি পদ্ধতি NSObject

আরও তথ্যের জন্য NSObjectডকুমেন্টেশন চেক করুন ।

আপনি এটি এইভাবে ব্যবহার করেন।

BOOL test = [self isKindOfClass:[SomeClass class]];

আপনি এ জাতীয় কিছু করার চেষ্টাও করতে পারেন

for(id element in myArray)
{
    NSLog(@"=======================================");
    NSLog(@"Is of type: %@", [element className]);
    NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No");
    NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");    
}

4
-1: classNameএটি ব্যবহার করবেন না , এটি ওএস এক্সে কাজ করতে পারে বা নাও করতে পারে, তবে এটি আইওএসে নেই এবং এটি এর জন্য ব্যবহার করার কথা নয়। এছাড়াও, NSLogসেইগুলি সেগুলি করে না যা আমার মনে হয় আপনি তাদের বোঝাতে চেয়েছিলেন - তারা শ্রেণীর নাম (সর্বদা একটি স্ট্রিং) এবং কোডার বর্গটি পরীক্ষা করছে, আশ্চর্যের সাথে, আসল উপাদানটির শ্রেণির পরিবর্তে।
andyvn22

5
দ্রুত চেক করার জন্য: NSLog(@"Is of type: %@", [element class]); আইওএস 7 এ কাজ করবে
পোর্টল্যান্ড রানার

1
@ পোর্টল্যান্ডরুনার: আমি ঠিক এটিই খুঁজছিলাম আইডি কে যদি এমন টিকিট থাকে যা সেই সঠিক জিনিসটিকে আরও ভালভাবে সম্বোধন করে তবে তা না হলে আপনার একটি তৈরি করা উচিত। যদি আপনি তা করেন তবে আমি আমাকে জানিয়ে দেব এবং আমি সেখানে উত্তরটি উপস্থাপন করব, কারণ এই স্নিপেটটি আমার পক্ষে ছিল। আবার ধন্যবাদ.
ম্যাট উইলিয়ামস

15

যখন আপনি একটি সুপারক্লাস এবং উত্তরাধিকারী ক্লাসের মধ্যে পার্থক্য করতে চান আপনি ব্যবহার করতে পারেন:

if([myTestClass class] == [myInheritedClass class]){
   NSLog(@"I'm the inheritedClass);
} 
if([myTestClass class] == [mySuperClass class]){
   NSLog(@"I'm the superClass);
} 

ব্যবহার - (BOOL)isKindOfClass:(Class)aClassএই ক্ষেত্রে 'সত্য' উভয় বার স্থাপিত কারণ inheritedClass এছাড়াও সুপারক্লাস এক ধরনের হবে।


3
isMemberOfClass:NOসাবক্লাসগুলির সাথে ডিল করার সময় ফিরে আসবে ।
মিপাদি

11

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

নীচের লাইনের জন্য, আমাদের কিছু খারাপভাবে তৈরি ডেটা রয়েছে যা একটি NSArray, একটি NSDictionaryবা হতে পারে (null)

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];

এই পরীক্ষা করা হয় যে:

NSLog(@"%@", [hits class]);

if ([hits isMemberOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

isKindOfClassবরং ভাল কাজ করেছেন যখন isMemberOfClassনা।


আমি আপনাকে পরীক্ষার জন্য কোড ভাগ করে নিতে দেখছি। তবে মুদ্রিত ফলাফল কোথায়?
nuynait

আমার কোডটি অনুলিপি করা এবং আপনার যা প্রয়োজন তার ফলাফল দেখুন তা ধারণা।
অ্যালেক্স জাভাটোন

9

আপনি নীচের কোডটি ব্যবহার করতে পারেন, যদি না আপনি আদিম ডেটা ধরণের প্রকারগুলি পরীক্ষা করতে চান।

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double)) 

5

সরল, [আপনারবজেক্ট শ্রেণি] এটি আপনারবজেক্টের শ্রেণীর নাম ফিরিয়ে দেবে।


1
আসলে এটি কোনও Classবস্তু ফেরত দেবে । যাইহোক, descriptionএই অবজেক্টের স্ট্রিং হিসাবে শ্রেণীর নাম হবে, সুতরাং আপনি এখনও কনসোলে এটি লগ করতে পারেন।
ডিভাইস 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.