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