मैं एक आईओएस ऐप बना रहा हूं और मुझे यह पता लगाने की आवश्यकता है कि NSString
में NSArray
में NSStrings
में से कोई भी शामिल है।कैसे जांचें कि एनएसएसटींग में एनएसएआरआरईआर में एनएसएसआरआरई में से एक है या नहीं?
उत्तर
BOOL found=NO;
for (NSString *s in arrayOfStrings)
{
if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) {
found = YES;
break;
}
}
यह आपके उपयोग के मामले के लिए एक मूर्खतापूर्ण अनुकूलन हो सकता है लेकिन कितना बड़ा सरणी है कि आप पुनरावृत्ति कर रहे हैं पर निर्भर करता है, यह उपयोगी/अधिक NSArray's
indexOfObjectWithOptions: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]);
धन्यवाद एडम! कोड का बहुत उपयोगी टुकड़ा, खूबसूरती से काम करता है! – FreeAppl3
एडम जवाब पर बहुत छोटे सुरक्षा सुधार: वहाँ के साथ एक बड़ा मुद्दा है "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);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
BOOL result = [predicate evaluateWithObject:theString];
iOS8 के रिलीज के साथ के रूप में, एप्पल localizedCaseInsensitiveContainsString
बुलाया NSString
करने के लिए एक नई विधि जोड़ा। यह वही करेगा जो आप चाहते हैं कि आसान तरीका:
BOOL found = NO;
NSString *string = @"ToSearchFor";
for (NSString *s in arrayOfStrings){
if ([string localizedCaseInsensitiveContainsString:s]) {
found = YES;
break;
}
}
यह काम करता था। धन्यवाद! – Josh