我正在尝试制作一个自动更正系统,当用户键入带有大写字母的单词时,自动更正不起作用。为了解决这个问题,我复制了输入的字符串,应用了 .lowercaseString,然后对它们进行了比较。如果字符串确实打错了,它应该更正这个词。但是,替换键入的单词的单词都是小写的。所以我只需要将 .uppercaseString 应用于第一个字母。我原本以为我可以使用
nameOfString[0]
但这显然不起作用。如何将字符串的第一个字母变为大写,然后打印首字母大写的完整字符串?
谢谢你的帮助!
我正在尝试制作一个自动更正系统,当用户键入带有大写字母的单词时,自动更正不起作用。为了解决这个问题,我复制了输入的字符串,应用了 .lowercaseString,然后对它们进行了比较。如果字符串确实打错了,它应该更正这个词。但是,替换键入的单词的单词都是小写的。所以我只需要将 .uppercaseString 应用于第一个字母。我原本以为我可以使用
nameOfString[0]
但这显然不起作用。如何将字符串的第一个字母变为大写,然后打印首字母大写的完整字符串?
谢谢你的帮助!
包括符合 API 指南的变异和非变异版本。
斯威夫特 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()
}
}
斯威夫特 4:
extension String {
func capitalizingFirstLetter() -> String {
return prefix(1).uppercased() + self.lowercased().dropFirst()
}
mutating func capitalizeFirstLetter() {
self = self.capitalizingFirstLetter()
}
}
Swift 5.1 或更高版本
extension StringProtocol {
var firstUppercased: String { prefix(1).uppercased() + dropFirst() }
var firstCapitalized: String { prefix(1).capitalized + dropFirst() }
}
斯威夫特 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.0
对于“你好世界”
nameOfString.capitalized
或“你好世界”
nameOfString.uppercased
斯威夫特 4.0
string.capitalized(with: nil)
或者
string.capitalized
但是,这会将每个单词的首字母大写
苹果的文档:
大写字符串是将每个单词中的第一个字符更改为其相应的大写值,并将所有剩余字符设置为其相应的小写值的字符串。“单词”是由空格、制表符或行终止符分隔的任何字符序列。不考虑一些常见的单词分隔标点符号,因此此属性通常可能不会为多单词字符串产生所需的结果。有关其他信息,请参阅 getLineStart(_:end:contentsEnd:for:) 方法。
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()
对于斯威夫特 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())
}
}
对于单词中的第一个字符在.capitalized
swift 中使用和整个单词使用.uppercased()
Swift 2.0(单行):
String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())
在迅速 5
https://www.hackingwithswift.com/example-code/strings/how-to-capitalize-the-first-letter-of-a-string
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())
斯威夫特 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
这是Swift 5的一个版本,它使用Unicode 标量属性 API在第一个字母已经是大写字母或者没有大小写概念的情况下进行保释:
extension String {
func firstLetterUppercased() -> String {
guard let first = first, first.isLowercase else { return self }
return String(first).uppercased() + dropFirst()
}
}
从 Swift 3 你可以很容易地使用
textField.autocapitalizationType = UITextAutocapitalizationType.sentences
我正在使用 Kirsteins 的解决方案复制第一个字符。这将大写第一个字符,而不会看到双精度:
var s: String = "hello world"
s = prefix(s, 1).capitalizedString + suffix(s, countElements(s) - 1)
我不知道它的效率更高还是更低,我只知道它给了我想要的结果。
在 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 不起作用,它会将句子中的每个单词大写
将字符串中的第一个字符大写
extension String {
var capitalizeFirst: String {
if self.characters.count == 0 {
return self
return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst())
}
}
归功于莱昂纳多·萨维奥·达布斯:
我想大多数用例是获得正确的套管:
import Foundation
extension String {
var toProper:String {
var result = lowercaseString
result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString)
return result
}
}
我的解决方案:
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
}
我假设您想将整个单词串的第一个单词大写。例如:“我的猫很胖,我的脂肪很松弛”应该返回“我的猫很胖,我的脂肪很松弛”。
斯威夫特 5:
为此,您可以import Foundation
然后使用该capitalized
属性。例子 :
import Foundation
var x = "my cat is fat, and my fat is flabby"
print(x.capitalized) //prints "My Cat Is Fat, And My Fat Is Flabby"
如果你想成为一个纯粹主义者而不是import Foundation
,那么你可以创建一个字符串扩展。
extension String {
func capitalize() -> String {
let arr = self.split(separator: " ").map{String($0)}
var result = [String]()
for element in arr {
result.append(String(element.uppercased().first ?? " ") + element.suffix(element.count-1))
}
return result.joined(separator: " ")
}
}
然后你可以使用它,像这样:
var x = "my cat is fat, and my fat is flabby"
print(x.capitalize()) //prints "My Cat Is Fat, And My Fat Is Flabby"
如果你想大写字符串的每个单词,你可以使用这个扩展
斯威夫特 4 Xcode 9.2
extension String {
var wordUppercased: String {
var aryOfWord = self.split(separator: " ")
aryOfWord = aryOfWord.map({String($0.first!).uppercased() + $0.dropFirst()})
return aryOfWord.joined(separator: " ")
}
}
用过的
print("simple text example".wordUppercased) //output:: "Simple Text Example"
斯威夫特 4
func firstCharacterUpperCase() -> String {
if self.count == 0 { return self }
return prefix(1).uppercased() + dropFirst().lowercased()
}
这是我以小步骤完成的方式,类似于@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)
}
斯威夫特 3 更新
现在的replaceRange
功能是replaceSubrange
nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
return capString
}
也可以将您的字符串传入并返回大写的字符串。
斯威夫特 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 capitalizedFirst: String {
let characters = self.characters
if let first = characters.first {
return String(first).uppercased() +
String(characters.dropFirst())
}
return self
}
}
它通过只评估一次 self.characters 来努力提高效率,然后使用一致的形式来创建子字符串。
结合上面的答案,我写了一个小扩展,将每个单词的第一个字母大写(因为这是我一直在寻找的,并且认为其他人可以使用它)。
我谦虚地提交:
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
}
}
如果您的字符串全部大写,则以下方法将起作用
labelTitle.text = remarks?.lowercased().firstUppercased
此扩展程序将帮助您
extension StringProtocol {
var firstUppercased: String {
guard let first = first else { return "" }
return String(first).uppercased() + dropFirst()
}
}
在 viewDidLoad() 方法中添加这一行。
txtFieldName.autocapitalizationType = UITextAutocapitalizationType.words
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)
}
}
Edit: This no longer works with Text, only supports input fields now.
Just in case someone ends here with the same question regarding SwiftUI:
// Mystring is here
TextField("mystring is here")
.autocapitalization(.sentences)
// Mystring Is Here
Text("mystring is here")
.autocapitalization(.words)
对于 swift 5,您可以这样做:
为字符串创建扩展名:
extension String {
var firstUppercased: String {
let firstChar = self.first?.uppercased() ?? ""
return firstChar + self.dropFirst()
}
}
然后
yourString.firstUppercased
示例:“abc”->“Abc”