【Swift】頭文字だけを大文字に変更する

2022.01.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

頭文字だけを大文字に変えたいなぁと思ったので調べてみました。

今回はこちらの文字列を使い、頭文字だけ大文字に変更したいと思います。

let iamHappy = "I am Happy?"

下記の流れで進めていきます。

  1. 文字列を全て小文字にする
  2. 頭文字だけを取得して大文字にする
  3. 頭文字を除いた文字列を取得する
  4. 2と3をくっつける

環境

  • Xcode 13.2.1

文字列を全て小文字にする

まずは文字列を全て小文字にします。

// 文字列を全て小文字にする
let lowercaseIamHappy = iamHappy.lowercased()
print(lowercaseIamHappy) // 出力 i am happy?

文字列を全て小文字にしたもの取得する為、Stringのインスタンスメソッドlowercased()を使います。

このメソッドの返り値は、小文字になった文字列のコピーを返してくれます

頭文字だけを取得して大文字にする

文字列の頭文字だけを取得し、それを大文字にします。

// 頭文字だけを取得して大文字にする
let uppercaseInitial = lowercaseIamHappy.prefix(1).uppercased()
print(uppercaseInitial) // 出力 I

prefix(_:)メソッドを使用すると、コレクションの初期要素から、パラメーターとして指定したmaxLength値のまでのSubSequenceを返します。

今回は頭文字だけなのでmaxLength値を1にします

そして、その頭文字に対して、uppercased()を使用して大文字にします。

firstを使って頭文字を取得する

頭文字の取得は、Stringのインスタンスプロパティのfirstを使用することでも取得は可能です。

var first: Character? { get }

頭文字を除いた小文字の文字列を取得する

頭文字以外の文字列を取得します。

// 頭文字を除いた小文字の文字列を取得する
let droppedInitialIamHappy = lowercasedIamHappy.dropFirst()
print(droppedInitialIamHappy) // 出力  am happy?

dropFirst(_:)は、指定された数の初期要素を除くすべてを含むサブシーケンスを返してくれます。

func dropFirst(_ k: Int = 1) -> ArraySlice<Element>

デフォルトでは1が入っているので、パラメーターを入力しない場合は、頭文字より後ろの文字列を返します。

大文字の頭文字と小文字の文字列を組み合わせる

あとは、大文字の頭文字と小文字の文字列を組み合わせると完成です。

// 大文字にした頭文字と小文字の頭文字以外を組み合わせる
let uppercaseInitialIamHappey = uppercaseInitial + droppedInitialIamHappy
print(initialUppercasedIamHappey) // 出力 I am happy?

これで頭文字を大文字にした文字列を作成することが出来ました。

補足

今回は文字列に区切り文字があったのですが、区切り文字がない場合はcapitalizedプロパティで簡単に頭文字だけを大文字にした文字列を取得することが出来ます。

capitalizedプロパティでは、各単語の最初の文字が大文字に変更されたものを取得できます。この各単語とは、スペース、タブ、または行末記号で区切られた文字になります。

I am Happy?だとスペースがあるので、各単語の最初の文字が大文字になり、出力結果はI Am Happy?になります。

let iamHappy = "I am Happy?"
let capitalizedIamHappy = iamHappy.capitalized
print(capitalizedIamHappy) // 出力 I Am Happy?

IamHappy?のように区切り文字がない場合は、captalizedで簡単に頭文字だけが大文字になったものを取得出来ます。

let iamHappyWithoutSpaces = "IamHappy?"
let capitalizedIamHappy = iamHappyWithoutSpaces.capitalized
print(capitalizedIamHappy) // 出力 Iamhappy?

おまけ

StringのExtensionを作ってみました。

initialUppercasedを使用すると、頭文字だけが大文字になった文字列を返してくれます。

extension String {

    /// 頭文字は大文字、それ以外は小文字のStringを返す
    func initialUppercased() -> String {
        let lowercasedString = self.lowercased()
        return lowercasedString.prefix(1).uppercased() + lowercasedString.dropFirst()
    }
}

おわりに

頭文字だけ大文字にできてスッキリしたのですが、

頭文字って言葉、なんだか気持ち悪いですよね。

参考