Простой способ установить одиночный символ 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
для улучшения удобочитаемости.