Cocoa 将NSString的单个字符设置为大写的简单方法

Cocoa 将NSString的单个字符设置为大写的简单方法,cocoa,cocoa-touch,nsstring,Cocoa,Cocoa Touch,Nsstring,我想将NSString的第一个字符改为大写。不幸的是,-(NSString*)大写字符串将每个单词的第一个字母转换为大写。有没有一种简单的方法可以将单个字符转换成大写 我目前正在使用: NSRange firstCharRange = NSMakeRange(0,1); NSString* firstCharacter = [dateString substringWithRange:firstCharRange]; NSString* uppercaseFirstChar = [firstCh

我想将NSString的第一个字符改为大写。不幸的是,
-(NSString*)大写字符串
将每个单词的第一个字母转换为大写。有没有一种简单的方法可以将单个字符转换成大写

我目前正在使用:

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

这似乎有点复杂,但至少对底层unicode字符串的编码没有任何假设。

因为
NSString
是不可变的,所以您所拥有的似乎是实现您想要做的事情的好方法。
(NSString*)uppercaseString
和类似方法的实现可能与您编写的非常相似,因为它们返回一个新的
NSString
,而不是修改您发送消息的对象。

与您的方法非常相似,但更为精简:

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

我有一个类似的要求,但它是字符串中的字符。假设我是您要大写的字符的索引,这对我很有用:

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

如果您分析了这些解决方案,则执行此操作的速度要慢得多:

NSMutableString *capitolziedString = [NSMutableString stringWithString:originalString];
NSString *firstChar = [[capitolziedString substringWithRange:NSMakeRange(0,1)] uppercaseString];
[capitolziedString replaceCharactersInRange:NSMakeRange(0, 1) withString:firstChar];
在运行iOS 5的iphone 4上进行测试时:
@杜姆斯波克的解决方案运行时间为0.115750毫秒
而上述时间为0.064250ms

在运行iOS 5的模拟器上进行测试时:
@杜姆斯波克的解决方案运行时间为0.02232毫秒

而上述时间为0.007495毫秒

为了获得最大的可读性,在
NSString
上创建一个
类别
,并为其提供以下功能:

NSString *capitalizeFirstLetter(NSString *string) {
    NSString *firstCapital = [string substringToIndex:1].capitalizedString;
    return [string stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:firstCapital];
}
然后在您想要的代码中:

NSString *capitalizedSentence = capitalizeFirstLetter(dateString);

这种代码很少出现在您需要它的地方,通常应该被分解到实用程序类或
类别中以提高易读性。

这里对案例映射进行了很好的讨论:在该页面的术语中,您想做的是简单的字符映射吗?是的,针对cr/lf进行了优化;-)我喜欢让乐观主义者去掉我的临时表。似乎下划线被认为是有效的分隔符,因此如果重复运行此函数,foo_bar将被转换为“foo_bar”。可能会担心您的解决方案在1/3到1/2的时间内运行,但我们正在寻找“最简单”的解决方案,这是最易读的。@ArtOfWarfare我的解决方案并不比你的更难阅读,如果你要将解决方案封装在一个类别中,你可能再也看不到了,然后,您应该构建最快的解决方案,这样以后就不会因为编写了低效的代码而出现奇怪的性能问题。