265

我正在尝试制作一个自动更正系统,当用户键入带有大写字母的单词时,自动更正不起作用。为了解决这个问题,我复制了输入的字符串,应用了 .lowercaseString,然后对它们进行了比较。如果字符串确实打错了,它应该更正这个词。但是,替换键入的单词的单词都是小写的。所以我只需要将 .uppercaseString 应用于第一个字母。我原本以为我可以使用

nameOfString[0]

但这显然不起作用。如何将字符串的第一个字母变为大写,然后打印首字母大写的完整字符串?

谢谢你的帮助!

4

30 回答 30

557

包括符合 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()
    }
}
于 2014-10-10T19:07:02.993 回答
187

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ž"
于 2015-02-02T22:52:00.330 回答
105

斯威夫特 3.0

对于“你好世界”

nameOfString.capitalized

或“你好世界”

nameOfString.uppercased
于 2016-12-02T13:12:28.017 回答
51

斯威夫特 4.0

string.capitalized(with: nil)

或者

string.capitalized

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

苹果的文档:

大写字符串是将每个单词中的第一个字符更改为其相应的大写值,并将所有剩余字符设置为其相应的小写值的字符串。“单词”是由空格、制表符或行终止符分隔的任何字符序列。不考虑一些常见的单词分隔标点符号,因此此属性通常可能不会为多单词字符串产生所需的结果。有关其他信息,请参阅 getLineStart(_:end:contentsEnd:for:) 方法。

于 2017-11-03T23:52:27.913 回答
25
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())
    }
}
于 2014-12-31T07:29:08.947 回答
23

对于单词中的第一个字符在.capitalizedswift 中使用和整个单词使用.uppercased()

于 2018-05-10T10:32:34.543 回答
10

Swift 2.0(单行):

String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())
于 2016-01-12T08:39:30.537 回答
8

在迅速 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())
于 2019-05-16T09:30:18.817 回答
6

斯威夫特 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
于 2017-07-20T09:18:18.203 回答
4

这是Swift 5的一个版本,它使用Unicode 标量属性 API在第一个字母已经是大写字母或者没有大小写概念的情况下进行保释:

extension String {
  func firstLetterUppercased() -> String {
    guard let first = first, first.isLowercase else { return self }
    return String(first).uppercased() + dropFirst()
  }
}
于 2019-01-30T03:45:12.297 回答
3

从 Swift 3 你可以很容易地使用 textField.autocapitalizationType = UITextAutocapitalizationType.sentences

于 2018-08-16T08:31:29.343 回答
2

我正在使用 Kirsteins 的解决方案复制第一个字符。这将大写第一个字符,而不会看到双精度:

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

我不知道它的效率更高还是更低,我只知道它给了我想要的结果。

于 2015-01-04T07:26:40.373 回答
2

在 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 不起作用,它会将句子中的每个单词大写

于 2016-11-13T23:14:47.223 回答
2

将字符串中的第一个字符大写

extension String {
    var capitalizeFirst: String {
        if self.characters.count == 0 {
            return self

        return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst())
    }
}
于 2016-12-27T14:26:55.300 回答
1

归功于莱昂纳多·萨维奥·达布斯:

我想大多数用例是获得正确的套管:

import Foundation

extension String {

    var toProper:String {
        var result = lowercaseString
        result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString)
        return result
    }
}
于 2015-03-02T19:15:03.917 回答
1

我的解决方案:

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
}
于 2015-07-14T10:07:47.847 回答
1

我假设您想将整个单词串的第一个单词大写。例如:“我的猫很胖,我的脂肪很松弛”应该返回“我的猫很胖,我的脂肪很松弛”。

斯威夫特 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"
于 2021-07-20T15:43:25.360 回答
1

如果你想大写字符串的每个单词,你可以使用这个扩展

斯威夫特 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"
于 2018-05-21T08:03:35.387 回答
1

斯威夫特 4

func firstCharacterUpperCase() -> String {
        if self.count == 0 { return self }
        return prefix(1).uppercased() + dropFirst().lowercased()
    }
于 2018-08-02T11:41:11.157 回答
0

这是我以小步骤完成的方式,类似于@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)
}
于 2015-01-25T01:41:54.590 回答
0

斯威夫特 3 更新

现在的replaceRange功能是replaceSubrange

nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)
于 2017-03-23T13:39:20.890 回答
0
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
    let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
    return capString
}

也可以将您的字符串传入并返回大写的字符串。

于 2016-02-17T04:33:57.990 回答
0

斯威夫特 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: " ")
    }
}
于 2017-11-09T20:10:57.067 回答
0

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

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 来努力提高效率,然后使用一致的形式来创建子字符串。

于 2017-08-12T12:49:27.183 回答
0

结合上面的答案,我写了一个小扩展,将每个单词的第一个字母大写(因为这是我一直在寻找的,并且认为其他人可以使用它)。

我谦虚地提交:

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
    }
}
于 2015-11-24T20:34:57.513 回答
0

如果您的字符串全部大写,则以下方法将起作用

labelTitle.text = remarks?.lowercased().firstUppercased

此扩展程序将帮助您

extension StringProtocol {
    var firstUppercased: String {
        guard let first = first else { return "" }
        return String(first).uppercased() + dropFirst()
    }
}
于 2018-07-18T13:42:53.943 回答
-1

在 viewDidLoad() 方法中添加这一行。

 txtFieldName.autocapitalizationType = UITextAutocapitalizationType.words
于 2020-02-19T11:27:34.543 回答
-1
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)
    }
}
于 2016-10-27T15:47:01.013 回答
-2

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)
于 2021-04-29T17:14:50.420 回答
-4

对于 swift 5,您可以这样做:

为字符串创建扩展名:

extension String {
    var firstUppercased: String {
        let firstChar = self.first?.uppercased() ?? ""
        return firstChar + self.dropFirst()
    }
}

然后

yourString.firstUppercased

示例:“abc”->“Abc”

于 2019-09-17T09:34:33.630 回答