2010-06-19 10 views
48

एक वस्तु है जो एक विशिष्ट संपत्ति के लिए एक विशिष्ट महत्व है के लिए एक NSSet या NSArray खोज करने के लिए कैसे?किसी ऑब्जेक्ट के लिए NSSet या NSArray कैसे खोजें, जिसमें किसी विशिष्ट प्रॉपर्टी के लिए विशिष्ट मान हो?

उदाहरण: मैं 20 वस्तुओं के साथ एक NSSet है, और हर वस्तु एक type संपत्ति है। मैं पहली वस्तु प्राप्त करना चाहता हूं जिसमें [theObject.type isEqualToString:@"standard"] है।

मुझे याद है कि यह सामान की इस तरह की किसी भी तरह विधेय उपयोग करने के लिए संभव हो गया था, है ना?

उत्तर

76
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %@", @"standard"]; 
NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicate]; 
id firstFoundObject = nil; 
firstFoundObject = filteredArray.count > 0 ? filteredArray.firstObject : nil; 

एनबी: के बाद से एक सेट में वस्तुओं के आदेश अपरिभाषित है एक NSSet में पहले पाया वस्तु की धारणा कोई मतलब नहीं है।

+0

यह काम करता है अगर वस्तु 'प्रकार' संपत्ति नहीं है, लेकिन एक और वस्तु है (चलो 'नौकरी' कहें), और यह 'नौकरी' है जिसमें 'प्रकार' संपत्ति है? – darksider

+0

हाँ, पर एक वर्ग के मुख्य मान कुंजी आप एक विधेय में उपयोग करना चाहते हैं के लिए अनुरूप कोडिंग होना चाहिए। , यह कोई बात नहीं है कि एक सेट का आदेश दिया नहीं है - (1) आप बल्कि एक * स्ट्रिंग से एक वास्तविक विधि का उपयोग करें * (2) आप "पहली" तत्व आप पाते हैं पर रोक: –

+0

'indexOfObjectPassingTest' लगता है दो कारणों के लिए बेहतर आप अभी भी एक आइटम चाहते हैं। –

4
NSArray* results = [theFullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.type LIKE[cd] %@", @"standard"]]; 
17

आप जेसन और ओले के रूप में फ़िल्टर सरणी का वर्णन किया है हो सकता है, लेकिन जब से तुम सिर्फ एक वस्तु चाहते हैं, मैं - indexOfObjectPassingTest: का उपयोग करेंगे (अगर यह एक सरणी में है) या -objectPassingTest: (अगर यह एक सेट में है) और बनाने से बचें दूसरी सरणी

+1

एक NSArray के लिए एक अच्छा विचार लगता है यही कारण है, लेकिन NSSet में विधि वास्तव में '-objectsPassingTest है:' (बहुवचन ध्यान दें), तो यह विचार सीधे संभव वहाँ, अगर मैं इस सही ढंग से समझ नहीं है। – Ashley

13

आम तौर पर, मैं indexOfObjectPassingTest: का उपयोग के रूप में मैं इसे और अधिक सुविधाजनक ऑब्जेक्टिव-सी कोड के बजाय NSPredicate वाक्य रचना में अपने परीक्षण व्यक्त करने के लिए लगता है। है

NSArray *array = @[@0,@1,@2,@3]; 
NSUInteger indexOfTwo = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
    return ([(NSNumber *)obj integerValue] == 2); 
}]; 
NSUInteger indexOfFour = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
    return ([(NSNumber *)obj integerValue] == 4); 
}]; 
BOOL hasTwo = (indexOfTwo != NSNotFound); 
BOOL hasFour = (indexOfFour != NSNotFound); 
NSLog(@"hasTwo: %@ (index was %d)", hasTwo ? @"YES" : @"NO", indexOfTwo); 
NSLog(@"hasFour: %@ (index was %d)", hasFour ? @"YES" : @"NO", indexOfFour); 

इस कोड के उत्पादन: यहाँ एक सरल उदाहरण है (कल्पना करो कि integerValue वास्तव में एक संपत्ति थी)

hasTwo: YES (index was 2) 
hasFour: NO (index was 2147483647) 
संबंधित मुद्दे