অবজেক্টিভ-সিতে কোন বস্তুটি কোন শ্রেণীর হয় তা আমি কীভাবে পরীক্ষা করব?


207

অবজেক্ট-সি-তে কোনও বস্তু নির্দিষ্ট শ্রেণীর উদাহরণ কিনা তা আমি কীভাবে পরীক্ষা করব? ধরা যাক আমি দেখতে চাই যে বস্তুটি ক্লাস বি, বা ক্লাস সি এর উদাহরণ, আমি কীভাবে এটি করতে যাব?

উত্তর:


345

বস্তুটি ক্লাস ক এর উদাহরণ কিনা তা পরীক্ষা করতে:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

অথবা

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

অবজেক্টের শ্রেণীর নাম পেতে আপনি NSStringFromClassফাংশনটি ব্যবহার করতে পারেন :

NSString *className = NSStringFromClass([yourObject class]);

বা উদ্দেশ্য-সি রানটাইম এপিআই থেকে সি-ফাংশন:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

সম্পাদনা: সুইফটে

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

69
Class_getName ()
वेश


3
আমার বোধগম্যতা এটি কেবল এনএসবজেক্টের উত্তরাধিকারী অবজেক্টের জন্য কাজ করে।
হেনরিক পি। হ্যাসেল

1
@afEkenholm - তবে আইওএস 4.x এ নয়, কেবলমাত্র আমরা জানি।
জেজে রোহার

2
class_getNameওভার ব্যবহার করে কী সুবিধা NSStringFromClass? যদি কিছুই না থাকে তবে এই উত্তরটি সামঞ্জস্য করা উচিত।
ড্যান রোজনস্টার্ক

21

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

NSString *className = [[myObject class] description]; 

যে কোনও এনএসবজেক্টে


8
প্রোগ্রামার বর্ণনা পদ্ধতিটি ওভাররাইড করেছে কিনা তার ভিত্তিতে এটি কাজ করতে পারে বা নাও করতে পারে। [অবজেক্ট ক্লাস] বা এনএসএসস্ট্রিংফ্রমক্লাস ব্যবহার করে সর্বদা ক্লাসের নাম ফিরে আসে।
ভবিষ্যতলাইট

1
আপনার রহস্য অবজেক্টটি কি ধরণের ডিবাগিং এবং তা জানার জন্য ভাল!
এম জেসি

3

অ্যাপল ডকুমেন্টেশনে #KindOfClass সম্পর্কে কী বোঝায়

ক্লাস ক্লাস্টার দ্বারা প্রতিনিধিত্ব করা অবজেক্টগুলিতে এই পদ্ধতিটি ব্যবহার করার সময় সাবধান হন। ক্লাস ক্লাস্টারের প্রকৃতির কারণে, আপনি যে জিনিসটি ফিরে পাবেন তা সর্বদা আপনার প্রত্যাশিত ধরণের নাও হতে পারে। আপনি যদি এমন কোনও পদ্ধতিতে কল করেন যা ক্লাস ক্লাস্টারকে রিটার্ন দেয় তবে সেই পদ্ধতিটি দ্বারা ফিরে আসা সঠিক ধরণটি আপনি সেই অবজেক্টটি দিয়ে কী করতে পারেন তার সেরা সূচক। উদাহরণস্বরূপ, যদি কোনও পদ্ধতি কোনও এনএসআরাই অবজেক্টকে একটি পয়েন্টার দেয়, নিম্নলিখিত কোডে দেখানো হিসাবে অ্যারেটি পরিবর্তনযোগ্য কিনা তা দেখার জন্য আপনাকে এই পদ্ধতিটি ব্যবহার করা উচিত নয়:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

আপনি যদি এই কোডটি আপনার কোডটিতে ব্যবহার করেন তবে আপনি মনে করতে পারেন যে কোনও বস্তুকে বাস্তবে সংশোধন করা উচিত নয় তা সংশোধন করা ঠিক। এটি করার পরে অন্যান্য কোডগুলির ক্ষেত্রে সমস্যা তৈরি হতে পারে যা প্রত্যাশাটি অপরিবর্তিত থাকবে।


আপনার উদাহরণ কোডটি সঠিক নয়। আপনি যদি কেবল এনএসআরির জন্য পরীক্ষা করেন তবে আপনি সমস্যার মধ্যে পড়বেন, যা যাইহোক অপরিবর্তনীয়। আপনি যদি কোনও নির্দিষ্ট শ্রেণির জন্য পরীক্ষা করতে চান তবে পরিবর্তে আপনার isMemberOfClass ব্যবহার করা উচিত।
ভবিষ্যতলেઇટ 7

@ ভাউচারেলাইট 7 এটি শ্রেণীর ধরণের জন্য কীভাবে পরীক্ষা করবেন না তার একটি উদাহরণ । অ্যাপল ডকুমেন্টেশন বলে যে -isKindOfClass:-isMemberOfClass:একটি বর্গ ক্লাস্টার মধ্যে বস্তু শনাক্ত করতে না ব্যবহার করা উচিত।
pxpographicics

3

আপনি যদি একটি নির্দিষ্ট ক্লাসের জন্য পরীক্ষা করতে চান তবে আপনি ব্যবহার করতে পারেন

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}

1

আপনি যদি ক্লাসের নাম পেতে চান তবে কেবল কল করুন: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);

0

আপনি রান সময় পরীক্ষা করতে পারেন। কোড এবং ভিতরে ভিতরে একটি ব্রেকপয়েন্ট রাখুন (lldb) কনসোল রাইটিং

(lldb) po [yourObject class]

এটার মত..

এখানে চিত্র বর্ণনা লিখুন

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