Swift仅将.uppercaseString应用于string的第一个字母

我正在尝试制作自动更正系统,并且当用户使用大写字母键入单词时,自动更正不起作用。 为了解决这个问题,我做了一个string的复制,应用.lowercaseString,然后进行比较。 如果string的确输错了,应该纠正这个字。 但是,replaceinput的单词是全部小写的。 所以我需要应用.uppercaseString只有第一个字母。 我原本以为我可以使用

nameOfString[0] 

但是这显然不起作用。 我怎样才能得到string的第一个字母大写,然后能够打印完整的string与大写的第一个字母?

谢谢你的帮助!

包括符合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() + dropFirst() } mutating func capitalizeFirstLetter() { self = self.capitalizingFirstLetter() } } 

Xcode 9•Swift 4

 extension String { var firstUppercased: String { guard let first = first else { return "" } return String(first).uppercased() + dropFirst() } } 

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

Swift 3.0

为“Hello World”

 nameOfString.capitalized 

或“HELLO WORLD”

 nameOfString.uppercased 
 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 2.0(单行):

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

我得到与Kirsteins的解决scheme重复的第一个字符。 这将大写第一个字符,而不会看到双重:

 var s: String = "hello world" s = prefix(s, 1).capitalizedString + suffix(s, countElements(s) - 1) 

我不知道这是多less有效率,我只知道它给了我想要的结果。

信贷给莱昂纳多萨维奥达布斯:

我想大多数用例是获得适当的shell:

 import Foundation extension String { var toProper:String { var result = lowercaseString result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString) return result } } 

我的解决scheme

 func firstCharacterUppercaseString(string: String) -> String { var str = string as NSString let firstUppercaseCharacter = str.substringToIndex(1).uppercaseString let firstUppercaseCharacterString = str.stringByReplacingCharactersInRange(NSMakeRange(0, 1), withString: firstUppercaseCharacter) return firstUppercaseCharacterString } 

结合上面的答案,我写了一个小的扩展名,用大写的每个单词的首字母(因为这就是我正在寻找,并认为别人可以使用它)。

我虚心提交:

 extension String { var wordCaps:String { let listOfWords:[String] = self.componentsSeparatedByString(" ") var returnString: String = "" for word in listOfWords { if word != "" { var capWord = word.lowercaseString as String capWord.replaceRange(startIndex...startIndex, with: String(capWord[capWord.startIndex]).uppercaseString) returnString = returnString + capWord + " " } } if returnString.hasSuffix(" ") { returnString.removeAtIndex(returnString.endIndex.predecessor()) } return returnString } } 

大写string中的第一个字符

 extension String { var capitalizeFirst: String { if self.characters.count == 0 { return self return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst()) } } 

在Swift 3.0中(比接受的答案要快一些,也比较安全):

 extension String { func firstCharacterUpperCase() -> String { if let firstCharacter = characters.first { return replacingCharacters(in: startIndex..<index(after: startIndex), with: String(firstCharacter).uppercased()) } return "" } } 

nameOfString.capitalized将不起作用 ,它会将句子中的每个单词都大写

这是我用小步骤完成的方式,类似于@Kirsteins。

 func capitalizedPhrase(phrase:String) -> String { let firstCharIndex = advance(phrase.startIndex, 1) let firstChar = phrase.substringToIndex(firstCharIndex).uppercaseString let firstCharRange = phrase.startIndex..<firstCharIndex return phrase.stringByReplacingCharactersInRange(firstCharRange, withString: firstChar) } 
 func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{ let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString return capString } 

同样的作品只是传递你的string,并获得一个大写的string。

Swift 3更新

replaceRange func现在是replaceSubrange

 nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized) 

我偏爱这个版本,这是从另一个答案清理的版本:

 extension String { var capitalizedFirst: String { let characters = self.characters if let first = characters.first { return String(first).uppercased() + String(characters.dropFirst()) } return self } } 

它通过只评估一次自身字符来努力提高效率,然后使用一致的forms来创build子string。

Swift 4(Xcode 9.1)

 extension String { var capEachWord: String { return self.split(separator: " ").map { word in return String([word.startIndex]).uppercased() + word.lowercased().dropFirst() }.joined(separator: " ") } } 
 extension String { var lowercased:String { var result = Array<Character>(self.characters); if let first = result.first { result[0] = Character(String(first).uppercaseString) } return String(result) } } 

Swift 4.0

 string.capitalized(with: nil) 

要么

 string.capitalized 

但是,这将每个单词的首字母大写

苹果的文档:

大写的string是一个string,每个单词中的第一个字符被更改为相应的大写字母,剩下的所有字符都被设置为相应的小写字母。 “单词”是由空格,制表符或行结束符分隔的任何字符序列。 一些常用的分隔标点符号不被考虑,所以这个属性通常不会产生多string所需的结果。 请参阅getLineStart(_:end:contentsEnd:for :)方法以获取更多信息。

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 

大写只有string的第一个字符

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