【Swift】firstIndex(of:)とは?意味や使い方をわかりやすく解説

Swiftでコレクション型の配列等を扱う際、「特定の要素がどこにあるのか知りたい」という場面はよくある。

そんなときに便利なのがfirstIndex(of:)メソッドだ。

firstIndex(of:)は「配列の中の最初の要素を取得するメソッド?」と勘違いしがちだが、実際には異なる。

本記事では、firstIndex(of:)の意味や使い方についてサンプルコードを交えながら解説する。

スポンサーリンク

firstIndex(of:)とは?

firstIndex(of:)は、配列やコレクション内で「指定した要素が最初に出現するインデックス(位置)」を取得するためのメソッドである。

恥ずかしながら、私はしばらくの間、配列の一番最初の要素を取得すると勘違いしていた。

しかし、そうではなく、指定した配列において出現する最初の位置=インデックス(取得する値は 0 , 1, 2などの整数)を取得するのだ。

例えば、下記では、fruits配列においてappleが最初に現れるインデックスを取得している。

上記コードの実行結果は下記となる。

配列fruitsの中のappleのインデックスが返されていることがお分かりいただけると思う。

firstIndexの名称から推測できる通り、同じ値が配列の中に何度も出現していても、最初に現れた位置番号=インデックスを返す。

そのため、下記のように配列fruitsにappleが何個も含まれていても、firstIndex(of:)が返す値は最初に出現する0となる。

このfirstIndex(of:)は、要素が存在しない場合にnilを返すため、指定した要素が存在するかどうかも同時に確認することが出来る。

スポンサーリンク

firstIndex(of:)の使い方  

firstIndex(of:)は下記のように対象となる配列とその対象となる値を指定して使う。

firstIndex1

下記コードで具体例を確認しよう。

上記でfirstIndex(of:)が使用されているのは下記部分だ。

firstIndex2

apple はfruits配列の先頭(インデックス=0)にあるので、結果は0が返される。

配列の1番目だが、インデックスは0となるのは要注意だ。

firstIndex3

対象の値をbananaに変更したら、今度はインデックスとして 1 が返される。

firstIndex5

firstIndex(of:)を利用することで返される値が整数であることがお分かりいただけると思う。

今回はシンプルな例にしたため、対象の値をそのまま記載しているが、通常、firstIndex(of:)を利用する際は変数に格納されているはずだ。

Listの対象行を削除する場合などにfirstIndex(of:)は非常によく活用される。

firstIndex(of:)を利用する際の注意点

firstIndex(of:)を利用する際の注意点として下記2点が挙げられる。

  1. nilへの対応
  2. Equatableプロトコルの準拠

1.nilへの対応

firstIndex(of:)は、指定した要素がコレクション内に見つからない場合にnilを返す

そのため、アプリのクラッシュを防ぐために必ずif letguard letで安全にアンラップしてあげる必要がある。

if let やguard letについては下記記事を参考にして欲しい。

2.Equatableプロトコルの準拠

firstIndex(of:)を使用するには、配列の要素がEquatableプロトコルに準拠している必要がある。

Equatableプロトコルは「等価比較が可能な型」を意味する。

標準の型(Int、Stringなど)はすでに準拠済みなので、特にEquatableプロトコルを意識せずに利用可能だ。

まとめ

firstIndex(of:)は、Swiftのコレクション型の配列等で指定した要素が最初に出現する時のインデックスを取得するためのメソッドである。

主なポイントは下記の通りだ。

  • 指定要素の最初のインデックスを取得できる(存在しない場合はnilを返す)
  • 戻り値はオプショナル型であるため、if letやguard letを利用し、安全にアンラップする必要がある
  • コレクション内の対象要素がEquatableに準拠している必要がある

少しでも参考になれば幸いだ。

 

おすすめの記事