如何在Swift中将字符串的首字母转换为大写?

280
我正在尝试制作一个自动校正系统,当用户输入的单词有大写字母时,自动校正不起作用。为了解决这个问题,我复制了输入的字符串,应用了 .lowercaseString 方法进行比较。如果字符串确实拼写错误,它就会纠正单词。但是替换输入单词的单词变成了全小写。所以我需要对第一个字母应用 .uppercaseString 方法。我最初以为可以使用...
nameOfString[0]

但是显然这样不起作用。如何将字符串的第一个字母大写,并能够打印首字母大写的完整字符串?

谢谢任何帮助!


1
接受的答案已经过时,请查看这个 - Juan Boero
31个回答

568

包括符合 API 指南的可变和不可变版本。

Swift 3:

extension String {
    func capitalizingFirstLetter() -> String {
        let first = String(characters.prefix(1)).capitalized
        let other = String(characters.dropFirst())
        return first + other
    }

    mutating func capitalizeFirstLetter() {
        self = self.capitalizingFirstLetter()
    }
}

Swift 4:

extension String {
    func capitalizingFirstLetter() -> String {
      return prefix(1).uppercased() + self.lowercased().dropFirst()
    }

    mutating func capitalizeFirstLetter() {
      self = self.capitalizingFirstLetter()
    }
}

3
请注意,.capitalizedString 在Xcode 7 Beta 4中不再起作用。在Swift 2.0中,字符串发生了一些变化。 - kakubei
2
@Kirsteins:你说得对,我的错。我忘了导入“Foundation”库 尴尬的笑容 - kakubei
3
使用.uppercaseString可以实现该功能。 - Kirsteins
2
这是非常有效的答案,伙计。使用Xcode 7.1.1 / Swift 2.1进行工作...谢谢 :) - onCompletion
32
现在只需使用.capitalized。另请注意 capitalizedStringWith(_ locale:) - Raphael
显示剩余9条评论

210

Swift 5.1或更高版本

extension StringProtocol {
    var firstUppercased: String { prefix(1).uppercased() + dropFirst() }
    var firstCapitalized: String { prefix(1).capitalized + dropFirst() }
}

Swift 5

extension StringProtocol {
    var firstUppercased: String { return prefix(1).uppercased() + dropFirst() }
    var firstCapitalized: String { return prefix(1).capitalized + dropFirst() }
}

"Swift".first  // "S"
"Swift".last   // "t"
"hello world!!!".firstUppercased  // "Hello world!!!"

"DŽ".firstCapitalized   // "Dž"
"Dž".firstCapitalized   // "Dž"
"dž".firstCapitalized   // "Dž"

3
干得好。我编辑了我的代码以便首字母小写,并将其重命名为 Proper。 - ericgu
1
我刚刚创建了一个新项目,似乎当它与UITextFieldTextDidChangeNotificationUITextField观察器一起使用时会导致内存泄漏。 - Henny Lee
应该这样写:"var uppercaseFirst: String { return first.uppercased() + String(characters.dropFirst()).--->lowercased<--- }",以确保驼峰命名法后面的所有字符都是小写的。 - mskw
@NicolasMiari 如果没有第一个字符,返回self也会返回一个空字符串。 - Leo Dabus
1
@LeoDabus 我猜这取决于哪个更能清晰地表达代码的意图。空字符串字面量可能是最好的选择。 - Nicolas Miari
显示剩余9条评论

116

Swift 3.0

用于“Hello World”的代码。

nameOfString.capitalized

或者是针对"HELLO WORLD"

nameOfString.uppercased

3
两个月前,Charlesism已经用Swift 3版本回答了这个问题。 - Eric Aya
17
这将使字符串中每个单词的第一个字符大写,而不仅仅是第一个单词。 - Bocaxica
返回值:该字符串的大写副本。public func uppercased() -> StringSwift 3.0 或对于“HELLO WORLD”nameOfString.uppercased而不是上面那个nameOfString.uppercased() - Azharhussain Shaikh

54

Swift 4.0

string.capitalized(with: nil)
string.capitalized

然而这个方法会使每个单词的首字母都大写

苹果公司的文档:

一个首字母大写的字符串是指,将每个单词的第一个字符更改为其对应的大写字母,其余所有字符都设置为对应的小写字母。一个“单词”是由空格、制表符或行终止符界定的任何字符序列。某些常见的单词分隔标点符号不被考虑在内,因此该属性可能不能为多个单词组成的字符串普遍产生所需的结果。有关详细信息,请参见getLineStart(_:end:contentsEnd:for :)方法。


3
我不知道为什么人们对这个答案不太接受。如果人们只想要第一个单词大写,他们可以使用 capitalized 属性轻松地获取第一个单词并将其大写。 - ScottyBlades
2
重要的是,“Capitalised” 对于所有 Unicode 字符都是正确的,而对于第一个字符使用“uppercased”则不正确。 - gnasher729

27
extension String {
    func firstCharacterUpperCase() -> String? {
        let lowercaseString = self.lowercaseString

        return lowercaseString.stringByReplacingCharactersInRange(lowercaseString.startIndex...lowercaseString.startIndex, withString: String(lowercaseString[lowercaseString.startIndex]).uppercaseString)
    }
}

let x = "heLLo"
let m = x.firstCharacterUpperCase()

对于 Swift 5 版本:

extension String {
    func firstCharacterUpperCase() -> String? {
        guard !isEmpty else { return nil }
        let lowerCasedString = self.lowercased()
        return lowerCasedString.replacingCharacters(in: lowerCasedString.startIndex...lowerCasedString.startIndex, with: String(lowerCasedString[lowerCasedString.startIndex]).uppercased())
    }
}

这是我个人认为最好的答案 - 对于所有未来的情况都保持简单。 - Robert
无需检查字符串是否为空并初始化一个字符串来替换任何内容。您可以简单地取消包装第一个字符,如果失败,则返回nil。可以简化为 var firstCharacterUpperCase: String? { guard let first = first else { return nil } return lowercased().replacingCharacters(in: startIndex...startIndex, with: first.uppercased()) } - Leo Dabus

27

在 Swift 中,若想将单词的首字母大写,可以使用 .capitalized;若想将整个单词全部大写,可以使用.uppercased()


变量 capitalized: String { get } - Satya

10

Swift 2.0(单行):

String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())

1
点赞。但是,这假设原始字符串全部小写。我在末尾添加了.localizedLowercaseString,以使其适用于像:aNYsTring这样的字符串。String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString - oyalhi

10

在swift 5中

如何将字符串的第一个字母大写

extension String {
    func capitalizingFirstLetter() -> String {
        return prefix(1).capitalized + dropFirst()
    }

    mutating func capitalizeFirstLetter() {
        self = self.capitalizingFirstLetter()
    }
}

与您的字符串一起使用

let test = "the rain in Spain"
print(test.capitalizingFirstLetter())

6

Swift 3(xcode 8.3.3)

将字符串中所有的首字母都大写

let str = "your string"
let capStr = str.capitalized

//Your String

将所有字符改为大写

let str = "your string"
let upStr = str.uppercased()

//YOUR STRING

将字符串的首字母转换为大写

 var str = "your string"
 let capStr = String(str.characters.prefix(1)).uppercased() + String(str.characters.dropFirst())

//Your string

这不仅会将字符串的第一个字符大写 - Rool Paap

4
这是一个适用于Swift 5的版本,使用Unicode标量属性API,如果第一个字母已经是大写或者没有大小写概念,则退出。
extension String {
  func firstLetterUppercased() -> String {
    guard let first = first, first.isLowercase else { return self }
    return String(first).uppercased() + dropFirst()
  }
}

不需要用第一个字符初始化字符串。return first.uppercased() + dropFirst() 或者一行代码 (first?.uppercased() ?? "") + dropFirst() - Leo Dabus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接