@ DarkDust правильно. Вы не должны пытаться изменить саму локаль. Это не под вашим контролем, и, как вы видите, это не очень хорошо работает. Что наиболее важно, если вы просто хотите изменить одну операцию сортировки, это очень сложный способ сделать это .... Вы могли бы потенциально поиграть с различными записями Info.plist
локализации (особенно CFBundleLocalizations
), чтобы заставить это работать правильно , но не только для сортировки одного списка.
То, что вы хотите использовать, это compare:options:range:locale:
, что позволяет вам передавать конкретную локаль. Вы можете использовать этот метод внутри sortedArrayUsingSelector:
или sortedArrayUsingComparator:
.
Кроме того, вы можете использовать категорию для добавления пользовательского swedishCaseInsensitiveCompare:
к NSString
. Затем вы можете использовать NSSortDescriptor
, как и сейчас.
Пример. ä
сортируется после a
на английском языке, но после z
на шведском:
@interface NSString (SwedishSorting)
- (NSComparisonResult)caseInsensitiveSwedishCompare:(id)other;
@end
@implementation NSString (SwedishSorting)
- (NSComparisonResult)caseInsensitiveSwedishCompare:(id)other;
{
return [self compare:other options:NSCaseInsensitiveSearch range:NSMakeRange(0, self.length) locale:[[NSLocale alloc] initWithLocaleIdentifier:@"sv"]];
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSArray *array = [@"Jag är en test av sortering" componentsSeparatedByString:@" "];
NSArray *englishSort = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveCompare:)]]];
NSLog(@"English = %@", englishSort);
NSArray *swedishSort = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveSwedishCompare:)]]];
NSLog(@"Swedish = %@", swedishSort);
}
return 0;
}