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