Простой способ установить одиночный символ NSString в верхний регистр

Я хотел бы изменить первый символ NSString на верхний регистр. К сожалению, - (NSString *)capitalizedString преобразует первую букву каждого слова в верхний регистр. Есть ли простой способ конвертировать только один символ в верхний регистр?

В настоящее время я использую:

NSRange firstCharRange = NSMakeRange(0,1);
NSString* firstCharacter = [dateString substringWithRange:firstCharRange];
NSString* uppercaseFirstChar = [firstCharacter originalString];
NSMutableString* capitalisedSentence = [originalString mutableCopy];
[capitalisedSentence replaceCharactersInRange:firstCharRange withString:uppercaseFirstChar];

Что кажется немного запутанным, но, по крайней мере, не делает никаких предположений о кодировании базовой строки unicode.

Ответ 1

Так как NSString неизменен, то, что у вас есть, является хорошим способом сделать то, что вы хотите сделать. Реализации (NSString*)uppercaseString и аналогичных методов, вероятно, очень похожи на написанные вами, поскольку они возвращают новый NSString вместо того, чтобы изменять тот, на который вы отправили сообщение.

Ответ 2

Очень похожий подход к тому, что у вас есть, но немного более сгущающийся:

 NSString *capitalisedSentence = 
    [dateString stringByReplacingCharactersInRange:NSMakeRange(0,1)  
    withString:[[dateString  substringToIndex:1] capitalizedString]];

Ответ 3

У меня было аналогичное требование, но оно предназначалось для символов внутри строки. Это предполагает, что я является вашим индексом для символа, который вы хотите заглавным, чтобы это сработало для меня:

curword = [curword stringByReplacingCharactersInRange:NSMakeRange(i,1) 
           withString:[[curword substringWithRange:NSMakeRange(i, 1)] capitalizedString]];

Ответ 4

Если вы проецируете эти решения, они намного медленнее, чем это делает:

NSMutableString *capitolziedString = [NSMutableString stringWithString:originalString];
NSString *firstChar = [[capitolziedString substringWithRange:NSMakeRange(0,1)] uppercaseString];
[capitolziedString replaceCharactersInRange:NSMakeRange(0, 1) withString:firstChar];

в тестировании на iphone 4 под управлением iOS 5:
Решение @doomspork работает в 0.115750 мс
а выше - 0.064250 мс;

при тестировании на симуляторе с iOS 5:
Решение @doomspork работает в 0.021232 ms
а выше - 0,007495 мс;

Ответ 5

Направляя максимальную читаемость, сделайте a category на NSString и дайте ей эту функцию:

NSString *capitalizeFirstLetter(NSString *string) {
    NSString *firstCapital = [string substringToIndex:1].capitalizedString;
    return [string stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:firstCapital];
}

Затем в вашем коде, где вы хотите:

NSString *capitalizedSentence = capitalizeFirstLetter(dateString);

Этот тип кода редко находится в том месте, где он вам нужен, и его обычно следует убирать в класс утилиты или category для улучшения удобочитаемости.