프레임워크에 당연히 있는 기능일 줄 알았는데 없더라… 그래서 자작.
짤막한 설명
문자열 뒤집기는 C문자열로 바꾼다음 포인터를 쓰는게 제일 깔끔할 것 같아서 그렇게 했다. -UTF8String 메소드는 const char 타입 포인터를 리턴하는데, 이걸 char 형으로 강제캐스팅하는 게 찜찜해서 strcpy로 복사했는데, 어디서 이 함수도 상당히 나쁘다고 쓰지 말라더라. (다른 뭐를 쓰라던데 그게 기억이 안나서 그냥 씀)
malloc으로 할당한 메모리는 ARC의 관심밖이므로 철저히 free 해주는 나란 남자, 그런 남자…
문자열내 문자들을 사전순으로 정렬해주는 건 소인수 분해 따위나 할 때 쓸모가 있긴 있을텐데, NSArray의 sortedUsingComparator: 메소드를 사용했다. OSX에서는 코드 블럭( ^( ){ … } )을 쓰면 되는데 GNUStep에서는 이게 함수포인터를 쓰는 것 같더라. 아마 이 코드 그대로 쓰면 안될 듯. GNUStep의 정렬 메소드는 함수 포인터로 되어 있고 아예 메소드명이 달라서, NSSortDescriptor를 사용하는 방법으로 변경했다. 지난 번 버전의 코드는 여기에서 볼 수 있다.
함수 내에서 상당히 많은 autorelease 되는 NSString을 만들어낼 수도 있어서, 메소드 안쪽에 autoreleasepool 블럭을 설치해줬다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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 |