文字列の最初の文字だけに.uppercaseStringをすばやく適用する


232

オートコレクトシステムを作成しようとしています。ユーザーが大文字で単語を入力すると、オートコレクトが機能しません。これを修正するために、入力した文字列のコピーを作成し、.lowercaseStringを適用して、それらを比較しました。文字列が本当にタイプミスされている場合は、単語を修正する必要があります。ただし、入力された単語を置き換える単語はすべて小文字になります。したがって、.uppercaseStringを最初の文字のみに適用する必要があります。もともと使えると思った

nameOfString[0]

しかし、これは明らかに機能しません。文字列の最初の文字を大文字にして、最初の文字を大文字にして文字列全体を印刷するにはどうすればよいですか?

助けてくれてありがとう!

回答:


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
.capitalizedStringXcode 7 Beta 4では動作しないことに注意してください。Swift2.0では文字列が少し変更されています。
角兵衛2015

2
@Kirsteins:あなたは正しい、私の悪い。私は、インポートする忘れてFoundation 恥ずかしそうにやにや笑い
kakubei

3
@LoryLory Use .uppercaseStringfor
Kirsteins

2
これはXcodeの7.1.1 /スウィフト2.1 ....おかげ:)と真剣に効果的な回答mate..Workingある
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 2015年

私はSwift 2.1.1ソリューションが好きですが、アプリを実行してリークを確認すると、リークが発生していることがわかります。
ヘニーリー

1
新しいプロジェクトを作成しました。これをのUITextFieldオブザーバーと一緒に使用すると、メモリリークが発生するようですUITextFieldTextDidChangeNotification
ヘニーリー2016

@ヘンリーこれはコード自体とは何の関係もありません。パフォーマンス/メモリの問題が発生した場合は、アップルに報告してください。
レオDabus

1
@LeoDabusそれは、どれがコードの意図をより明白にするかにかかっていると思います。空の文字列リテラルがおそらく最良です。
Nicolas Miari 2017

84

Swift 3.0

「Hello World」

nameOfString.capitalized

または「HELLO WORLD」の場合

nameOfString.uppercased

3
Charlesismは2か月前にSwift 3バージョンで既に回答しています...
Eric Aya

11
これは、最初の単語だけでなく、文字列のすべての単語の最初の文字を大文字にします。
Bocaxica 2017年

戻り値:文字列の大文字のコピー。public func uppercased()-> String Swift 3.0または "HELLO WORLD"の場合nameOfString.uppercased INSTEAD OF ABOVE nameOfString.uppercased()
Azharhussain Shaikh

40

Swift 4.0

string.capitalized(with: nil)

または

string.capitalized

ただし、これはすべての単語の最初の文字を大文字にします

Appleのドキュメント:

大文字の文字列は、各単語の最初の文字が対応する大文字の値に変更され、残りのすべての文字が対応する小文字の値に設定された文字列です。「単語」とは、スペース、タブ、または行末記号で区切られた文字のシーケンスです。句読点を区切る一般的な単語は考慮されないため、このプロパティは通常、マルチワード文字列に対して望ましい結果を生成しない場合があります。詳細については、getLineStart(_:end:contentsEnd:for :)メソッドを参照してください。


1
なぜ人々がこの答えを受け入れないのか私にはわかりません。最初の単語だけを大文字にしたい場合は、最初の単語を取得して、大文字のプロパティで最も簡単に大文字にできます。
ScottyBlades 2017

1
重要なのは、「大文字」はすべてのUnicode文字に対して正しいことですが、最初の文字に「大文字」を使用することは正しくありません。
gnasher729 2018

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の最良の回答です。今後のすべてのケースで簡単に保つことができます。
Robert

文字列かどうかを確認し、文字列isEmptyを初期化してどちらかを置き換える必要はありません。最初の文字をアンラップするだけで、失敗した場合はnilを返します。これは次のように簡略化できますvar firstCharacterUpperCase: String? { guard let first = first else { return nil } return lowercased().replacingCharacters(in: startIndex...startIndex, with: first.uppercased()) }
レオダバス


10

Swift 2.0(単一行):

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

1
賛成。ただし、これは元の文字列がすべて小文字であることを前提としています。.localizedLowercaseStringaNYsTringのような文字列で動作するように、最後に追加しました。String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString
oyalhi 2016

4

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

文字列の最初の文字のみ大文字

 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)-> String {if s.isEmpty == false {let range = s.startIndex ... s.startIndex let original = s.substringWithRange(range)キャピタライズ= original.capitalizedStringの場合オリジナル==キャピタライズ{return s} s.replaceRange(range、with:capitalized)} return s}
David H

1
Swiftの新しいバージョンでは、countElementsですcount
George Poulos、2015

3

Swift 3から簡単に使用できます textField.autocapitalizationType = UITextAutocapitalizationType.sentences


3

ここでのバージョンですスウィフト5使用したUnicodeスカラプロパティのAPIを最初の文字が大文字すでにある、またはケースの概念を持っていない場合、救済するには:

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

文字列を最初の文字で初期化する必要はありません。return first.uppercased() + dropFirst()または1つのライナー(first?.uppercased() ?? "") + dropFirst()
レオダバス

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

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
レオDabus

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

私はこのバージョンに部分的です。これは別の回答からクリーンアップされたバージョンです。

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を1回だけ評価し、一貫した形式を使用して部分文字列を作成することで、より効率的になります。


0

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

stringはすでにと呼ばれる性質があるcapitalized。この目的のために、正確に
レオDabus

0

文字列の各単語を大文字にしたい場合は、この拡張子を使用できます

Swift 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
角兵衛

0

文字列がすべて大文字の場合、以下の方法が機能します

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

この拡張はあなたを助けます

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

1
単に使用する.capitalized
角兵衛

@角部なぜ反対票を投じるのか。このメソッドはSentanceの場合です。Capitalizedは、単語のすべての最初の文字を大文字にします。文字列の例:-(THIS IS A BOY) .capitalizedは(This Is A Boy)を返し、このメソッドは(This is a Boy)を返します。どちらも異なります。(+ ve投票を行うか、ネガティブを削除してください)
Ashu

おっしゃるとおり、@ ashuです。しかし、私はあなたが答えを編集するまで賛成票を投じることができないので、たぶん小さな空白を編集してそれを賛成票に入れます。またすみません。
角兵衛

文字列を最初の文字で初期化する必要はありません。return first.uppercased() + dropFirst()またはライナーが1往復(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」


Leo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.