Мне это нужно было сегодня, поэтому я реализовал его с категорией:
@interface NSString (Extensions)
- (NSString*) spacify;
@end
@implementation NSString (Extensions)
- (NSString*) spacify
{
// ignore irrelevant strings
if (self.length < 1)
return self;
NSMutableString* result = [NSMutableString stringWithString:self];
// create a range starting after the first character
NSRange range;
range.location = 1;
range.length = [self length] - 1;
// match any uppercase character
NSRegularExpression* r = [NSRegularExpression regularExpressionWithPattern: @"[A-Z]"
options: 0
error: nil];
// replace matches with the match preceded by a space
[r replaceMatchesInString: result
options: 0
range: range
withTemplate: @" $0"];
return [NSString stringWithString:result];
}
@end
Тесты:
@implementation NSStringExtensionsTest
- (void) testSpacify
{
NSString* target = @"ThisIsAStringX";
NSString* expected = @"This Is A String X";
NSString* actual = [target spacify];
STAssertEqualObjects(expected, actual, nil);
}
- (void) testSpacify_NoMatches_DoesNothing
{
NSString* target = @"thisisstring";
NSString* actual = [target spacify];
STAssertEqualObjects(target, actual, nil);
}
- (void) testSpacify_EmptyString_DoesNothing
{
NSString* target = @"";
NSString* actual = [target spacify];
STAssertEqualObjects(target, actual, nil);
}
- (void) testSpacify_InvalidLength_DoesNothing
{
NSString* target = @"A";
NSString* actual = [target spacify];
STAssertEqualObjects(target, actual, nil);
}
@end