2009-07-17 13 views
507

मुझे यह जांचने की आवश्यकता है कि ऑब्जेक्ट NSString या UIImageView प्रकार का है या नहीं। मैं यह कैसे हासिल कर सकता हूं? क्या कुछ प्रकार का "आइसोफ्ट टाइप" विधि है?उद्देश्य-सी में, मैं ऑब्जेक्ट प्रकार का परीक्षण कैसे करूं?

+0

देखें: [उद्देश्य-सी में जावा "उदाहरण" कीवर्ड के समतुल्य क्या है? (Http://stackoverflow.com/questions/536396/in-objective-c-what-is-the-equivelant- ऑफ-द-जावा-इंस्टेंसफ-कीवर्ड) – Reunanen

+31

हां वहाँ है: '[ऑब्जेक्ट हैकिंडऑफ क्लास: [क्लासनाम क्लास]] ' –

उत्तर

813

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

[myObject isKindOfClass:[NSString class]] 

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

[myObject isKindOfClass:[UIImageView class]] 
+80

ध्यान दें कि एक मेम्बरऑफ क्लास भी है: विधि जो वर्ग" सटीकता "की जांच करेगी। हालांकि इसके साथ सावधान रहें, क्योंकि कई ऐप्पल ऑब्जेक्ट वास्तव में कोर फाउंडेशन प्रकार छिपाने में हैं। (उदाहरण के लिए एक एनएसएसटींग अक्सर एक एनएससीएफस्ट्रिंग होता है, और यह MemberOfClass है: इस तुलना के लिए झूठी वापसी करेगा।) –

+2

नोट करें कि यह विधि बहुत धीमी है! – SAKrisT

+0

क्या यह सही है कि एनएसएसटींग एक क्लास क्लस्टर है? (एनएसएनंबर की तरह) – Ricardo

53

आप शायद का प्रयोग करेंगे

- (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");  
} 
+2

यह 'क्लासनाम' क्या है, मैं इसे अपने आईडी –

+4

के साथ काम नहीं कर सकता हूं, ऐसी कोई बात नहीं है –

+4

-1: 'className' का उपयोग न करें, यह ओएस एक्स पर काम कर सकता है या नहीं भी हो सकता है, लेकिन यह नहीं है आईओएस और इसका मतलब यह नहीं है कि इसका इस्तेमाल किया जाए। साथ ही, उन 'एनएसएलओजी' ऐसा नहीं करते हैं जो मुझे लगता है कि आप उन्हें समझते हैं - वे कक्षा तत्व (हमेशा एक स्ट्रिंग) और वास्तविक तत्व की कक्षा के बजाय अजीब तरह से कोडर वर्ग की जांच कर रहे हैं। – andyvn22

11

एक साधारण परीक्षण चल रहा है की तरह somthing कर कोशिश कर सकते हैं, मैंने सोचा कि मैं क्या काम करता है और क्या नहीं दस्तावेज़ चाहते हैं। अक्सर मैं लोगों को यह देखने के लिए देखता हूं कि ऑब्जेक्ट का वर्ग अन्य वर्ग का सदस्य है या अन्य वर्ग के बराबर है।

नीचे दी गई रेखा के लिए, हमारे पास कुछ खराब गठित डेटा है जो 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 नहीं किया।

12

आप एक सुपर क्लास और inheritedClass आप उपयोग कर सकते हैं के बीच भिन्न करना चाहते हैं:

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 भी सुपर क्लास का एक प्रकार है।

+2

'isMemberOfClass: उप-वर्गों से निपटने पर' '' वापस लौटाएगा। – mipadi

6

आप निम्नलिखित कोड का उपयोग कर सकते हैं जिसमें आप प्राचीन डेटा प्रकारों को देखना चाहते हैं।

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

सरल, [yourobject वर्ग] यह yourobject के वर्ग का नाम वापस कर देगा।

+1

वास्तव में यह एक 'कक्षा' वस्तु वापस कर देगा। हालांकि, इस ऑब्जेक्ट का 'वर्णन' वर्ग का नाम स्ट्रिंग के रूप में होगा, इसलिए आप इसे कंसोल पर लॉग कर सकते हैं। – devios1

संबंधित मुद्दे