【问题标题】:Easy way to set a single character of an NSString to uppercase将 NSString 的单个字符设置为大写的简单方法
【发布时间】:2009-05-19 16:52:20
【问题描述】:

我想将 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 字符串的编码没有任何假设。

【问题讨论】:

标签: cocoa cocoa-touch nsstring


【解决方案1】:

与您所拥有的方法非常相似,但更简洁:

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

【讨论】:

  • 是的,针对 cr/lf 进行了优化 ;-) 我喜欢让优化器把我的临时对象拿出来。
【解决方案2】:

由于NSString 是不可变的,你所拥有的似乎是做你想做的事的好方法。 (NSString*)uppercaseString 和类似方法的实现可能看起来很像您编写的内容,因为它们返回一个新的 NSString 而不是修改您发送消息的那个。

【讨论】:

  • 似乎下划线被认为是有效的分隔符,所以 foo_bar 将被转换为“Foo_Bar”
【解决方案3】:

我也有类似的要求,但它是针对字符串中的字符的。这假设 i 是您想要大写的字符的索引,这对我有用:

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];
    

    在运行 iOS 5 的 iphone 4 上进行测试:
    @doomspork 的解决方案在 0.115750 毫秒内运行
    而上面的运行时间为 0.064250 毫秒;

    在运行 iOS 5 的模拟器上进行测试:
    @doomspork 的解决方案在 0.021232 毫秒内运行
    而上面的运行时间为 0.007495 毫秒;

    【讨论】:

    • 如果此函数重复运行,您的解决方案可能会以 1/3 到 1/2 的时间运行,但我们正在寻找“最简单”的解决方案,读起来最清晰。
    • @ArtOfWarfare 我的解决方案并不比你的更难阅读,如果你要将解决方案封装在一个类别中,你可能永远不会再看,那么你应该构建最快的解决方案,这样您以后就不会因为编写效率低下的代码而遇到一些奇怪的性能问题。
    【解决方案5】:

    为了获得最大的可读性,在NSString 上创建一个category 并赋予它以下功能:

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

    然后在你想要的代码中:

    NSString *capitalizedSentence = capitalizeFirstLetter(dateString);
    

    这种代码很少出现在您需要的地方,通常应将其分解为实用程序类或category 以提高可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多