Swiftで文字列を分割する2つの方法!

swift

Swiftで文字列を分割する方法について書いています。
文字列を分割するにはsplitメソッドまたはcomponentsメソッドを使うことができます。

サンプルコードは、Swiftバージョン5.7で検証しています。

splitメソッドで分割する

文字列からsplitメソッドを呼び出して、文字列を分割することができます。
例えば、下記のように呼び出すことができます。

let fruits = "apple,grape,banana"
let splitFruits = fruits.split(separator: ",")

for fruit in splitFruits {
    print(fruit)
}

最初にfruits変数に文字列の「apple,grape,banana」を代入しています。
次の処理で、fruits変数からsplitメソッドを呼び出しています。

splitメソッドに対して、名前付き引数で文字列の「,」を渡しています。
これで、渡した文字列で分割して、配列を返してくれます。

返ってきた配列をsplitFruits変数に代入しました。
その後にfor文でひとつずつ取り出して、print関数で出力すると、下記のように出力されることが確認できました。

apple
grape
banana

分割回数を指定する

分割する文字列と一緒に、分割する回数をmaxSplitsで指定することができます。

let fruits = "apple,grape,banana,peach,lemon"
let splitFruits = fruits.split(separator: ",", maxSplits: 3)

for fruit in splitFruits {
    print(fruit)
}

fruits変数に文字列の「apple,grape,banana,peach,lemon」を代入しています。

次の行で、splitメソッドを使って「,」を元に分割しています。
一緒に名前付き引数のmaxSplitsも指定しています。ここに分割する回数を指定することができます。
今回は「3」を指定したので、3回分割されます。

for文で取り出して出力すると、下記のようになりました。

apple
grape
banana
peach,lemon

最初の3回だけ分割されて、最後の方は残っていることが確認できました。

componentsメソッドで分割する

componentsメソッドもsplitメソッドと同じように使うことができます。
例えば、下記のように文字列の変数から呼び出して使います。

let drinks = "water,cola,coffee,milk,beer"
let splitDrinks = drinks.components(separatedBy: ",")

for drink in splitDrinks {
    print(drink)
}

最初にdrinks変数に文字列の「water,cola,coffee,milk,beer」を代入しました。
次にdrinks変数からcomponentsメソッドを呼び出しています。

これで、splitメソッドと同じように、文字列を分割した結果を配列で返してくれます。
splitDrinks変数で結果を受け取って、for文でループしてひとつずつ出力してみました。

そうすると、下記のように分割されたことが確認できました。

water
cola
coffee
milk
beer

splitメソッドとcomponentsメソッドの違いは?

stackoverflowのこちらのページに質問されている方がいました。
確認してみると、splitメソッドの方がcomponentsメソッドより処理が速いとのことです。

分割対象文字が最後に入っているときが違う

また、分割対象の文字が最後に入っているときの挙動も違うようです。
例えば、下記のようなコードです。

let fruits = "apple,grape,banana,"
let splitFruits = fruits.split(separator: ",")

print(splitFruits) // ["apple", "grape", "banana"]

let drinks = "water,cola,coffee,"
let splitDrinks = drinks.components(separatedBy: ",")

print(splitDrinks) // ["water", "cola", "coffee", ""]

fruits変数とdrinks変数に、それぞれ分割対象の文字を入れています。
最後にも分割する対象の「,」がついています。

このときにsplitメソッドで分割させると、最後のカンマ(,)は無視されて、配列の要素は3つになります。
componentsメソッドで分割させると、最後のカンマ(,)も確認して、空の要素が入ります。

splitメソッドで空要素を無視しない

splitメソッドでcomponentsメソッドと同じように、空要素も無視しないようにするにはomittingEmptySubsequencesを使うと良いです。

let fruits = "apple,grape,banana,"
let splitFruits = fruits.split(separator: ",", omittingEmptySubsequences: false)

print(splitFruits) // ["apple", "grape", "banana", ""]

名前付き引数のomittingEmptySubsequencesfalseを渡すと、無視しないようになります。
これで、componentsメソッドを使った時と同じように空要素も含まれるようになりました。

Swiftで文字列を分割する方法まとめ

今回はSwiftで文字列を分割する方法を書きました。
記事の内容をまとめると、下記のようになります。

・文字列を分割するときにはsplitメソッドを使うと良い。
・componentsメソッドでも分割することはできる。
・splitメソッドの方が処理速度が速いとのこと。componentsメソッドと空要素の扱いなどの挙動が違う。

コメント

タイトルとURLをコピーしました