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


232

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

nameOfString[0]

但这显然行不通。如何将字符串的首字母转换为大写,然后将首字母大写的完整字符串打印出来?

谢谢你的帮助!

Answers:


512

包括与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()
    }
}

3
请注意,.capitalizedString在Xcode 7 Beta 4中不再可用。字符串在Swift 2.0中有所改变。
kakubei 2015年

2
@柯斯坦:你是对的,我不好。我忘了进口Foundation
令人毛骨悚然的

3
@LoryLory .uppercaseString用于此操作
Kirsteins

2
这是非常有效的答案。.使用Xcode 7.1.1 / Swift 2.1 ....谢谢:)
onCompletion

20
它只是.capitalized现在。另请注意capitalizedStringWith(_ locale:)
拉斐尔

152

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
不错的工作。我编辑了我的代码,使其首先通过小写字母,然后重命名为Proper。
ericgu'3

我喜欢迅速的2.1.1解决方案,但是当我运行我的应用程序并检查是否泄漏时,表明它正在泄漏。
Henny Lee

1
我刚刚创建了一个新项目,当它与的UITextField观察者一起使用时,似乎会导致内存泄漏UITextFieldTextDidChangeNotification
Henny Lee

@Henry这与代码本身无关。如果您遇到任何性能/内存问题,应将其报告给Apple。
Leo Dabus

1
@LeoDabus我想这取决于哪个使代码的意图更加明显。空字符串文字可能是最好的。
Nicolas Miari

84

斯威夫特3.0

对于“ Hello World”

nameOfString.capitalized

或“ HELLO WORLD”

nameOfString.uppercased

3
查尔斯主义已经在两个月前用Swift 3版本回答了…
埃里克·艾雅

11
这将大写字符串的每个单词的第一个字符,而不仅仅是第一个单词。
Bocaxica

返回:字符串的大写副本。公共函数uppercased()->字符串Swift 3.0或“ HELLO WORLD” nameOfString.uppercased上面安装的nameOfString.uppercased()
Azharhussain Shaikh

40

迅捷4.0

string.capitalized(with: nil)

要么

string.capitalized

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

苹果的文档:

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


1
我不知道为什么人们不接受这个答案。如果人们只想将首字母大写,则可以抓住首字母,并最容易使用首字母大写的资产将其首字母大写。
ScottyBlades

1
重要的是,“ Capitalized”对所有Unicode字符都是正确的,而对于第一个字符则不使用“大写”。
gnasher729

23
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 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())
    }
}

这是IMO的最佳答案-使其在以后的所有案例中都保持简单。
罗伯特

无需检查字符串isEmpty和初始化字符串以替换其中任何一个。您可以简单地解开第一个字符,以防万一失败则返回nil。可以简化为var firstCharacterUpperCase: String? { guard let first = first else { return nil } return lowercased().replacingCharacters(in: startIndex...startIndex, with: first.uppercased()) }
Leo Dabus

17

.capitalized快速使用单词中的第一个字符,使用完整单词中的第一个字符.uppercased()


10

Swift 2.0(单行):

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

1
已投票。但是,这假定原始字符串全部为小写。我.localizedLowercaseString在末尾添加了使其与aNYsTring这样的字符串一起使用。String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString
oyalhi

4

斯威夫特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

这不会只大写字符串的第一个字符
Rool Paap


3

我正在用Kirsteins的解决方案复制第一个字符。这将大写第一个字符,而不会出现双重:

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

我不知道它的效率是高还是低,我只知道它能给我带来理想的结果。


您可以测试大写的第一个字符是否会更改该字符-通过将其保存在自己的常量中,然后使用新的“大写”字符串测试是否相等,如果它们相同,则您已经拥有了所需的内容。
David H

您的帖子激发了这个答案-谢谢!:func capitaizeFirstChar(var s:String)->字符串{如果s.isEmpty == false {let range = s.startIndex ... s.startIndex let original = s.substringWithRange(range)如果原始==大写{return s} s.replaceRange(range,with:Capitalized)} return s}
大卫H

1
在较新版本的Swift中,countElements仅为count
乔治·普洛斯

3

在Swift 3中,您可以轻松使用 textField.autocapitalizationType = UITextAutocapitalizationType.sentences


3

这是Swift 5的一个版本,如果第一个字母已经是大写或没有大小写概念,则使用Unicode标量属性API进行纾困:

extension String {
  func firstLetterUppercased() -> String {
    guard let first = first, first.isLowercase else { return self }
    return String(first).uppercased() + dropFirst()
  }
}

无需使用第一个字符初始化String。return first.uppercased() + dropFirst()或一支班轮(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

2

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

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

        return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst())
    }
}

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


1

归功于Leonardo Savio Dabus:

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

import Foundation

extension String {

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

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
}

这不是纯粹的迅速。
Abhishek Bedi 2015年

1

结合上面的答案,我写了一个小扩展名,将每个单词的首字母大写(因为这就是我要查找的内容,并认为其他人可以使用它)。

我谦虚地提出:

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
    }
}

1
Swift String有一个称为capitalizedString的方法。如果您需要将其应用于字符串数组,请查看此答案stackoverflow.com/a/28690655/2303865
Leo Dabus,2016年

1

斯威夫特4

func firstCharacterUpperCase() -> String {
        if self.count == 0 { return self }
        return prefix(1).uppercased() + dropFirst().lowercased()
    }

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)
}

0
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
    let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
    return capString
}

也可以通过传递您的字符串并返回大写字母来起作用。


0

Swift 3更新

replaceRange功能现在replaceSubrange

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

capitalizedString方法已重命名为大写
Rool Paap

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


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: " ")
    }
}

String已经有一个capitalized专门为此目的而调用的属性
Leo Dabus

0

如果要大写字符串的每个单词,可以使用此扩展名

斯威夫特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"

2
只需使用.capitalized
kakubei

0

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

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

此扩展程序将帮助您

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

1
只需使用.capitalized
kakubei

@kakubei为什么要投反对票。此方法适用于Senance情况。大写将把单词的第一个字符变成大写。示例字符串:-(THIS IS A BOY) .capitalized将返回(This Is A Boy),并且此方法将返回(This Is Boyy)两者都不同。(请+投票或删除否定词)
阿舒

您说得对@ashu,对不起。但是,在您编辑答案之前,我无法投票,所以也许只做一个小的空白编辑,我会投票。再次抱歉。
卡库贝

无需使用第一个字符初始化String。return first.uppercased() + dropFirst()或一次班轮往返(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

0

在viewDidLoad()方法中添加此行。

 txtFieldName.autocapitalizationType = UITextAutocapitalizationType.words

-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)
    }
}

-1

对于Swift 5,您可以简单地执行以下操作:

yourString.firstUppercased

范例:“ abc”->“ Abc”


Swift中没有firstUppercased属性
Leo Dabus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.