콘텐츠로 건너뛰기
Home » [Cocoa / Objective-C] NSString의 문자열 뒤집기, 글자를 정렬한 문자열 구하기.

[Cocoa / Objective-C] NSString의 문자열 뒤집기, 글자를 정렬한 문자열 구하기.

프레임워크에 당연히 있는 기능일 줄 알았는데 없더라… 그래서 자작.

짤막한 설명

문자열 뒤집기는 C문자열로 바꾼다음 포인터를 쓰는게 제일 깔끔할 것 같아서 그렇게 했다. -UTF8String 메소드는 const char 타입 포인터를 리턴하는데, 이걸 char 형으로 강제캐스팅하는 게 찜찜해서 strcpy로 복사했는데, 어디서 이 함수도 상당히 나쁘다고 쓰지 말라더라. (다른 뭐를 쓰라던데 그게 기억이 안나서 그냥 씀)
malloc으로 할당한 메모리는 ARC의 관심밖이므로 철저히 free 해주는 나란 남자, 그런 남자…
문자열내 문자들을 사전순으로 정렬해주는 건 소인수 분해 따위나 할 때 쓸모가 있긴 있을텐데,  NSArraysortedUsingComparator: 메소드를 사용했다.  OSX에서는 코드 블럭( ^( ){ … } )을 쓰면 되는데 GNUStep에서는 이게 함수포인터를 쓰는 것 같더라. 아마 이 코드 그대로 쓰면 안될 듯. GNUStep의 정렬 메소드는 함수 포인터로 되어 있고 아예 메소드명이 달라서, NSSortDescriptor를 사용하는 방법으로 변경했다. 지난 번 버전의 코드는 여기에서 볼 수 있다.
함수 내에서 상당히 많은 autorelease 되는 NSString을 만들어낼 수도 있어서, 메소드 안쪽에 autoreleasepool 블럭을 설치해줬다.

/*
NSString+SPUtils
Category for NSString
-reversedString
: create reversed string.
NSString *reversed = [@"AbcdE" reversedString]; // reversed = @"EdcbA"
: create lexically sorted string.
NSString *sorted = [@"ae3ceox" sortedString]; // sorted = @"3aceeox"
23. 04. 13.
by sooop.
*/
#import <Foundation/Foundation.h>
@interface NSString (SPUtils)
-(NSString*)reversedString;
-(NSString*)sortedString;
@end;
@implementation NSString (SPUtils)
-(NSString*)reversedString
{
NSUInteger length = [self length], idx;
char *cString = (char*)malloc(sizeof(char)*(length+1));
strcpy(cString,[self UTF8String]);
char temp;
for(idx=0;idx<length/2;idx++) {
temp = *(cString + idx);
*(cString + idx) = *(cString + length - 1 - idx);
*(cString + length - 1 - idx) = temp;
}
NSString *reversedString = [NSString stringWithUTF8String:cString];
free(cString);
return reversedString;
}
-(NSString*)sortedString
{
NSString *resultString;
@autoreleasepool {
NSMutableArray *characters = [NSMutableArray array];
NSArray *sortedArray;
NSUInteger idx;
for(idx=0;idx<[self length];idx++) {
[characters addObject:[self substringWithRange:NSMakeRange(idx,1)]];
}
NSSortDescriptor *strDiscriptor = [[NSSortDescriptor alloc] initWithKey:@"description" ascending:YES];
NSArray *discs = @[strDiscriptor];
sortedArray = [characters sortedArrayUsingDescriptors:discs];
NSMutableString *string = [NSMutableString string];
for(idx=0;idx<[self length];idx++) {
[string appendString:[sortedArray objectAtIndex:idx]];
}
resultString = [string copy];
}
#if __has_feature(objc_arc)
return resultString;
#else
return [resultString autorelease];
#endif
}
@end