2012-06-23 19 views
5

में प्रत्येक शब्द पर एक विधि को कॉल करें, मैं NSString के माध्यम से लूप करना चाहता हूं और कुछ मानदंडों पर एक कस्टम फ़ंक्शन कॉल करना चाहता हूं (उदाहरण के लिए, "2 'एल है")। मैं सोच रहा था कि उस दृष्टिकोण का सबसे अच्छा तरीका क्या था। क्या मुझे खोज/प्रतिस्थापन पैटर्न का उपयोग करना चाहिए? ब्लाकों?एनएसएसटींग

-(NSString *)convert:(NSString *)wordToConvert{ 
    /// This I have already written 
    Return finalWord; 
} 

-(NSString *) method:(NSString *) sentenceContainingWords{ 
    // match every word that meets the criteria (for example the 2Ls) and replace it with what convert: does. 
} 

उत्तर

2

दो तरीके मैं एक सरणी है कि आप के लिए काम करेंगे पाशन के बारे में पता इस प्रकार हैं:

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

for (NSString *word in words) 
{ 
    NSString *transformedWord = [obj method:word]; 
} 

और

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

[words enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id word, NSUInteger idx, BOOL *stop){ 
    NSString *transformedWord = [obj method:word]; 
}]; 

अन्य विधि, –makeObjectsPerformSelector:withObject:, आप के लिए काम नहीं करेगा। यह [word method:obj] पर कॉल करने में सक्षम होने की अपेक्षा करता है जो आपकी अपेक्षा से पिछड़ा है।

+0

चीनी, जापानी, जर्मन, व्हाइटस्पेस जैसी कुछ भाषाओं के लिए शब्दों के बीच स्पष्ट सीमा नहीं है, इसलिए केन दृष्टिकोण उचित है। – Krodak

1

आप नियमित अभिव्यक्ति के साथ अपने मापदंड लिख सकता है, तो आप शायद एक नियमित रूप से इन शब्दों को लाने और फिर उन्हें अपने convert: विधि को पारित करने के लिए मिलान अभिव्यक्ति कर सकता है।

आप componentsSeparatedByString: या componentsSeparatedByCharactersInSet: का उपयोग करके शब्दों की एक सरणी में स्ट्रिंग का विभाजन भी कर सकते हैं, फिर सरणी में शब्दों पर जाएं और पता लगाएं कि वे आपके मानदंडों को किसी भी तरह फिट करते हैं या नहीं। अगर वे फिट होते हैं, तो उन्हें convert: पर पास करें।

उम्मीद है कि इससे मदद मिलती है।

-1

मैं इस तरह की स्ट्रिंग के माध्यम से जाने के लिए थोड़ी देर के लूप का उपयोग करने की सलाह दूंगा।

NSRange spaceRange = [sentenceContainingWords rangeOfString:@" "]; 
NSRange previousRange = (NSRange){0,0}; 
do { 
    NSString *wordString; 
    wordString = [sentenceContainingWord substringWithRange:(NSRange){previousRange.location+1,(spaceRange.location-1)-(previousRange.location+1)}]; 
    //use the +1's to not include the spaces in the strings 
    [self convert:wordString]; 
    previousRange = spaceRange; 
    spaceRange = [sentenceContainingWords rangeOfString:@" "]; 
} while(spaceRange.location != NSNotFound); 

इस कोड को शायद इसे फिर से लिखना होगा क्योंकि यह काफी मोटा है, लेकिन आपको यह विचार मिलना चाहिए।

संपादित करें: बस जैकब गोरबान की पोस्ट को देखा, आपको निश्चित रूप से ऐसा करना चाहिए।

18

स्ट्रिंग में शब्दों को गिनने के लिए, आपको -[NSString enumerateSubstringsInRange:options:usingBlock:]NSStringEnumerationByWords और NSStringEnumerationLocalized के साथ उपयोग करना चाहिए। सूचीबद्ध सभी अन्य विधियों में उन शब्दों की पहचान करने के साधनों का उपयोग किया जाता है जो लोकेल-उपयुक्त नहीं हो सकते हैं या सिस्टम परिभाषा के अनुरूप नहीं हो सकते हैं। उदाहरण के लिए, दो शब्दों को अल्पविराम से अलग किया गया है लेकिन व्हाइटस्पेस नहीं है (उदा। "Foo, bar") को किसी अन्य उत्तर से अलग शब्दों के रूप में नहीं माना जाएगा, लेकिन वे कोको टेक्स्ट दृश्यों में हैं।

[aString enumerateSubstringsInRange:NSMakeRange(0, [aString length]) 
          options:NSStringEnumerationByWords | NSStringEnumerationLocalized 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ 
    if ([substring rangeOfString:@"ll" options:NSCaseInsensitiveSearch].location != NSNotFound) 
     /* do whatever */; 
}]; 

-enumerateSubstringsInRange:options:usingBlock: के लिए दस्तावेज, यदि आप एक परिवर्तनशील स्ट्रिंग पर यह कहते हैं, आप सुरक्षित रूप से स्ट्रिंग उत्परिवर्तित सकते हैं enclosingRange भीतर प्रगणित जा रहा है। इसलिए, यदि आप मिलान करने वाले शब्दों को प्रतिस्थापित करना चाहते हैं, तो आप [aString replaceCharactersInRange:substringRange withString:replacementString] जैसे कुछ के साथ कर सकते हैं।