Swiftでコレクション型の配列等を扱う際、「特定の要素がどこにあるのか知りたい」という場面はよくある。
そんなときに便利なのがfirstIndex(of:)メソッドだ。
firstIndex(of:)は「配列の中の最初の要素を取得するメソッド?」と勘違いしがちだが、実際には異なる。
本記事では、firstIndex(of:)の意味や使い方についてサンプルコードを交えながら解説する。
Contents
firstIndex(of:)とは?
firstIndex(of:)は、配列やコレクション内で「指定した要素が最初に出現するインデックス(位置)」を取得するためのメソッドである。
恥ずかしながら、私はしばらくの間、配列の一番最初の要素を取得すると勘違いしていた。
しかし、そうではなく、指定した配列において出現する最初の位置=インデックス(取得する値は 0 , 1, 2などの整数)を取得するのだ。
例えば、下記では、fruits配列においてappleが最初に現れるインデックスを取得している。
1 2 3 4 5 6 7 8 9 | let fruits = ["apple", "banana", "cherry"] if let index = fruits.firstIndex(of: "apple") { //配列fruitesの中にappleが存在する場合 print("The first occurrence of 'apple' is at index \(index).") } else { //配列fruitesの中にappleが存在しない場合 print("'apple' is not found in the array.") } |
上記コードの実行結果は下記となる。
1 | The first occurrence of 'apple' is at index 0. //配列fruitsにおけるappleの位置=0 がprint文で表示された。 |
配列fruitsの中のappleのインデックスが返されていることがお分かりいただけると思う。
firstIndexの名称から推測できる通り、同じ値が配列の中に何度も出現していても、最初に現れた位置番号=インデックスを返す。
そのため、下記のように配列fruitsにappleが何個も含まれていても、firstIndex(of:)が返す値は最初に出現する0となる。
1 | let fruits = ["apple", "banana", "cherry", "apple"] |
このfirstIndex(of:)は、要素が存在しない場合にnilを返すため、指定した要素が存在するかどうかも同時に確認することが出来る。
firstIndex(of:)の使い方
firstIndex(of:)は下記のように対象となる配列とその対象となる値を指定して使う。
下記コードで具体例を確認しよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import SwiftUI struct ContentView: View { let fruits = ["apple", "banana", "cherry"] var body: some View { VStack(spacing: 20) { if let index = fruits.firstIndex(of: "apple") { Text("The first occurrence of apple is at index \(index).") } else { Text("apple is not in the array.") } } .padding() } } |
上記でfirstIndex(of:)が使用されているのは下記部分だ。
1 | fruits.firstIndex(of: "apple") |
apple はfruits配列の先頭(インデックス=0)にあるので、結果は0が返される。
配列の1番目だが、インデックスは0となるのは要注意だ。
対象の値をbananaに変更したら、今度はインデックスとして 1 が返される。
firstIndex(of:)を利用することで返される値が整数であることがお分かりいただけると思う。
今回はシンプルな例にしたため、対象の値をそのまま記載しているが、通常、firstIndex(of:)を利用する際は変数に格納されているはずだ。
Listの対象行を削除する場合などにfirstIndex(of:)は非常によく活用される。
firstIndex(of:)を利用する際の注意点
firstIndex(of:)を利用する際の注意点として下記2点が挙げられる。
- nilへの対応
- Equatableプロトコルの準拠
1.nilへの対応
firstIndex(of:)は、指定した要素がコレクション内に見つからない場合にnilを返す
そのため、アプリのクラッシュを防ぐために必ずif letやguard letで安全にアンラップしてあげる必要がある。
1 2 3 4 5 6 7 8 | let fruits = ["apple", "banana", "cherry"] // fruits.firstIndex(of: "apple")の結果がnilでない場合のみ、if文を実行する if let index = fruits.firstIndex(of: "apple") { print("The first occurrence of 'apple' is at index \(index).") } else { print("'apple' is not found in the array.") } |
if let やguard letについては下記記事を参考にして欲しい。
2.Equatableプロトコルの準拠
firstIndex(of:)を使用するには、配列の要素がEquatableプロトコルに準拠している必要がある。
Equatableプロトコルは「等価比較が可能な型」を意味する。
標準の型(Int、Stringなど)はすでに準拠済みなので、特にEquatableプロトコルを意識せずに利用可能だ。
まとめ
firstIndex(of:)は、Swiftのコレクション型の配列等で指定した要素が最初に出現する時のインデックスを取得するためのメソッドである。
主なポイントは下記の通りだ。
- 指定要素の最初のインデックスを取得できる(存在しない場合はnilを返す)
- 戻り値はオプショナル型であるため、if letやguard letを利用し、安全にアンラップする必要がある
- コレクション内の対象要素がEquatableに準拠している必要がある
少しでも参考になれば幸いだ。