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", ""]
名前付き引数のomittingEmptySubsequences
にfalse
を渡すと、無視しないようになります。
これで、componentsメソッドを使った時と同じように空要素も含まれるようになりました。
Swiftで文字列を分割する方法まとめ
今回はSwiftで文字列を分割する方法を書きました。
記事の内容をまとめると、下記のようになります。
・componentsメソッドでも分割することはできる。
・splitメソッドの方が処理速度が速いとのこと。componentsメソッドと空要素の扱いなどの挙動が違う。
コメント