Я хотел отфильтровать все, кроме букв и цифр, поэтому я адаптировал реализацию категории Lorean для категории NSString, чтобы она работала немного иначе. В этом примере вы указываете строку, содержащую только те символы, которые хотите сохранить, а все остальное отфильтровывается:
@interface NSString (PraxCategories)
+ (NSString *)lettersAndNumbers;
- (NSString*)stringByKeepingOnlyLettersAndNumbers;
- (NSString*)stringByKeepingOnlyCharactersInString:(NSString *)string;
@end
@implementation NSString (PraxCategories)
+ (NSString *)lettersAndNumbers { return @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; }
- (NSString*)stringByKeepingOnlyLettersAndNumbers {
return [self stringByKeepingOnlyCharactersInString:[NSString lettersAndNumbers]];
}
- (NSString*)stringByKeepingOnlyCharactersInString:(NSString *)string {
NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:string];
NSMutableString * mutableString = @"".mutableCopy;
for (int i = 0; i < [self length]; i++){
char character = [self characterAtIndex:i];
if([characterSet characterIsMember:character]) [mutableString appendFormat:@"%c", character];
}
return mutableString.copy;
}
@end
Как только вы создали свои категории, их использование становится тривиальным, и вы можете использовать их в любой NSString:
NSString *string = someStringValueThatYouWantToFilter;
string = [string stringByKeepingOnlyLettersAndNumbers];
Или, например, если вы хотите избавиться от всего, кроме гласных:
string = [string stringByKeepingOnlyCharactersInString:@"aeiouAEIOU"];
Если вы все еще изучаете Objective-C и не используете категории, я советую вам попробовать их. Это лучшее место для подобных вещей, потому что оно дает больше функциональности всем объектам класса, который вы классифицируете.
Категории упрощают и инкапсулируют код, который вы добавляете, облегчая повторное использование во всех ваших проектах. Это отличная особенность Objective-C!