2011-01-15 9 views
17

मैं एक आईओएस ऐप बना रहा हूं और मुझे यह पता लगाने की आवश्यकता है कि NSString में NSArray में NSStrings में से कोई भी शामिल है।कैसे जांचें कि एनएसएसटींग में एनएसएआरआरईआर में एनएसएसआरआरई में से एक है या नहीं?

उत्तर

35
BOOL found=NO; 
for (NSString *s in arrayOfStrings) 
{ 
    if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) { 
    found = YES; 
    break; 
    } 
} 
+0

यह काम करता था। धन्यवाद! – Josh

13

यह आपके उपयोग के मामले के लिए एक मूर्खतापूर्ण अनुकूलन हो सकता है लेकिन कितना बड़ा सरणी है कि आप पुनरावृत्ति कर रहे हैं पर निर्भर करता है, यह उपयोगी/अधिक NSArray'sindexOfObjectWithOptions:passingTest: विधि का उपयोग करने performant हो सकता है।

इस विधि के साथ आप कुछ विकल्प और एक ब्लॉक पास करते हैं जिसमें आपका परीक्षण होता है। NSEnumerationConcurrent विकल्प पास करने से आपके ब्लॉक के मूल्यांकन को कई धागे पर एक साथ और संभावित रूप से गति की गति पर होने की अनुमति मिल जाएगी। मैंने invariant के परीक्षण का पुन: उपयोग किया, लेकिन थोड़ा अलग तरीके से। ब्लॉक क्रियात्मक रूप से इनवर्स के कार्यान्वयन में "पाए गए" चर के समान एक बूल देता है। "* स्टॉप = हाँ;" रेखा इंगित करती है कि पुनरावृत्ति रोकना चाहिए।

अधिक जानकारी के लिए एनएसएआरएआरई संदर्भ दस्तावेज देखें। Reference

NSArray *arrayOfStrings = ...; 
NSString *stringToSearchWithin = ..."; 
NSUInteger index = [arrayOfStrings indexOfObjectWithOptions:NSEnumerationConcurrent 
               passingTest:^(id obj, NSUInteger idx, BOOL *stop) 
        { 
         NSString *s = (NSString *)obj; 
         if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) { 
          *stop = YES; 
          return YES; 
         } 
         return NO; 
        }]; 
if (arrayOfStrings == nil || index == NSNotFound) 
{ 
    NSLog(@"The string does not contain any of the strings from the arrayOfStrings"); 
    return; 
} 
NSLog(@"The string contains '%@' from the arrayOfStrings", [arrayOfStrings objectAtIndex:index]); 
+0

धन्यवाद एडम! कोड का बहुत उपयोगी टुकड़ा, खूबसूरती से काम करता है! – FreeAppl3

4

एडम जवाब पर बहुत छोटे सुरक्षा सुधार: वहाँ के साथ एक बड़ा मुद्दा है "objectAtIndex:" क्योंकि यह है पूरी तरह से थ्रेड-सुरक्षित नहीं और अपने अनुप्रयोग क्रैश ज्यादा भी अक्सर कर देगा। तो मुझे क्या करना:

NSArray *arrayOfStrings = ...; 
NSString *stringToSearchWithin = ..."; 
__block NSString *result = nil; 
[arrayOfStrings indexOfObjectWithOptions:NSEnumerationConcurrent 
          passingTest:^(NSString *obj, NSUInteger idx, BOOL *stop) 
    { 
     if ([stringToSearchWithin rangeOfString:obj].location != NSNotFound) 
     { 
      result = obj; 
      *stop = YES; 
      //return YES; 
     } 
     return NO; 
    }]; 
if (!result) 
    NSLog(@"The string does not contain any of the strings from the arrayOfStrings"); 
else 
    NSLog(@"The string contains '%@' from the arrayOfStrings", result); 
4
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray]; 
BOOL result = [predicate evaluateWithObject:theString]; 
0

iOS8 के रिलीज के साथ के रूप में, एप्पल localizedCaseInsensitiveContainsString बुलाया NSString करने के लिए एक नई विधि जोड़ा। यह वही करेगा जो आप चाहते हैं कि आसान तरीका:

BOOL found = NO; 
NSString *string = @"ToSearchFor"; 
for (NSString *s in arrayOfStrings){ 
    if ([string localizedCaseInsensitiveContainsString:s]) { 
     found = YES; 
     break; 
    } 
} 
संबंधित मुद्दे