ऑब्जेक्टिव-सी में, मैं ऑब्जेक्ट प्रकार का परीक्षण कैसे करूं?


557

मुझे यह जांचने की आवश्यकता है कि क्या वस्तु प्रकार की है NSStringया नहीं UIImageView। मैं यह कैसे हासिल कर सकता हूं? क्या "आइसोफ़ाइप" विधि का कोई प्रकार है?


32
हाँ वहाँ है:[object isKindOfClass:[ClassName class]]
फिलिप लेबेर्ट

जवाबों:


880

यदि आपकी वस्तु है myObject, और आप यह देखना चाहते हैं कि क्या यह एक है NSString, तो कोड परीक्षण करेगा:

[myObject isKindOfClass:[NSString class]]

इसी तरह, यदि आप myObjectएक के लिए परीक्षण करना चाहते थे UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
ध्यान दें कि एक isMemberOfClass भी है: विधि जो कक्षा के लिए जांच करेगी "सटीकता।" हालांकि इसके साथ सावधान रहें, क्योंकि कई एप्पल वस्तुएं वास्तव में भेस में कोर फाउंडेशन प्रकार हैं। (जैसे। एक NSString अधिक बार एक NSCFString है, और isMemberOfClass: इस तुलना के लिए गलत वापस आ जाएगा।)
क्रेग ओटिस

3
ध्यान दें यह विधि बहुत धीमी है!
SAKrisT

क्या यह जानना सही है कि NSString एक क्लास क्लस्टर है? (NSNumber की तरह)
रिकार्डो

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, यह OS X पर काम कर सकता है या नहीं भी कर सकता है, लेकिन यह iOS में नहीं है और इसका उपयोग इसके लिए नहीं किया जाता है। इसके अलावा, वे NSLogऐसा नहीं करते हैं जो मुझे लगता है कि आप उनका मतलब था - वे वास्तविक तत्व के वर्ग के बजाय, वर्ग नाम (हमेशा एक स्ट्रिंग) और कोडर वर्ग की जांच कर रहे हैं।
एंडविन

5
एक त्वरित जांच के लिए: यह NSLog(@"Is of type: %@", [element class]); iOS 7 में काम करेगा
पोर्टलैंड रनर

1
@PortlandRunner: यह वही है जो मैं देख रहा था। आईडीके अगर कोई टिकट है जो उस सटीक चीज़ को बेहतर तरीके से संबोधित करता है, लेकिन यदि नहीं, तो आपको एक बनाना चाहिए। यदि आप करते हैं, तो मुझे पता है और मैं वहाँ जवाब दे दूंगा, क्योंकि यह स्निपेट मेरे लिए क्लच था। एक बार फिर धन्यवाद।
मैट विलियम्स

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इस मामले में उपयोग करने से TRUE का परिणाम दोनों बार होगा, क्योंकि इनहेरिटेडक्लास भी एक प्रकार का सुपरक्लास है।


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

सरल, [Yourobject class] यह yourobject के वर्ग नाम को लौटा देगा।


1
वास्तव में यह एक Classवस्तु लौटाएगा । हालाँकि, descriptionइस ऑब्जेक्ट में से एक स्ट्रिंग के रूप में वर्ग का नाम होगा, इसलिए आप इसे अभी भी कंसोल में लॉग कर सकते हैं।
devios1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.