2011-09-06 17 views
14

परीक्षण करने का सबसे अच्छा तरीका क्या है यदि एनएसएआरएआरई में किसी निश्चित प्रकार की कक्षा का ऑब्जेक्ट होता है? containsObject: समानता के लिए परीक्षण प्रतीत होता है, जबकि मैं isKindOfClass: समानता जांच की तलाश में हूं।कैसे जांचें कि एनएसएआरएआरई में किसी विशेष वर्ग का ऑब्जेक्ट है या नहीं?

उत्तर

23

आप आधारित गणना ब्लॉक इस्तेमाल कर सकते हैं इस के रूप में अच्छी तरह से करना।

// This will eventually contain the index of the object. 
// Initialize it to NSNotFound so you can check the results after the block has run. 
__block NSInteger foundIndex = NSNotFound; 

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[MyClass class]]) { 
     foundIndex = idx; 
     // stop the enumeration 
     *stop = YES; 
    } 
}]; 

if (foundIndex != NSNotFound) { 
    // You've found the first object of that class in the array 
} 

आप अपने सरणी में वर्ग इस तरह के एक से अधिक वस्तु है, तो आप उदाहरण थोड़ा tweak करना होगा, लेकिन यह आप आप क्या कर सकते की एक विचार देना चाहिए।

इस तेजी से गणना का एक लाभ यह है कि यह आपको ऑब्जेक्ट की अनुक्रमणिका को वापस करने की अनुमति देता है। इसके अलावा यदि आपने enumerateObjectsWithOptions:usingBlock: का उपयोग किया है तो आप इसे समवर्ती रूप से खोजने के लिए विकल्प सेट कर सकते हैं, इसलिए आपको मुफ्त में थ्रेडेड गणना मिलती है, या चुनें कि सरणी को रिवर्स में खोजना है या नहीं।

ब्लॉक आधारित API अधिक लचीला है। यद्यपि वे नए और जटिल दिखते हैं, फिर भी उनका उपयोग शुरू करने के बाद उन्हें चुनना आसान होता है - और फिर आप उन्हें हर जगह उपयोग करने के अवसर देखना शुरू कर देते हैं।

+0

गणना आधारित रोकने के लिए एक चर निर्दिष्ट करने में सक्षम होने के अलावा, ब्लॉक आधारित विधि का उपयोग करने में क्या फायदा है? – futureelite7

+0

मैं -1 के बजाय NSNotFound का उपयोग करूंगा। – NSResponder

+0

@NSResponder - अच्छा पकड़ - धन्यवाद। – Abizern

7

आप वर्ग के लिए जाँच सरणी के माध्यम से पाश के लिए तेजी से गणन उपयोग कर सकते हैं और:

BOOL containsClass = NO; 

for (id object in array) { 
    if ([object isKindOfClass:[MyClass class]]) { 
     containsClass = YES; 
     break; 
    } 
} 
8

आप इसे एनएसपी्रेडिकेट के साथ कर सकते हैं।

NSPredicate *p = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", 
                 [NSNumber class]]; 
NSArray *filtered = [identifiers filteredArrayUsingPredicate:p]; 
NSAssert(filtered.count == identifiers.count, 
     @"Identifiers can only contain NSNumbers."); 
संबंधित मुद्दे

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