【Swift】.enumerated()とは?使い方や活用シーン、注意点までわかりやすく解説

Swiftで配列を扱っていると「要素の中身だけでなく、そのインデックスも一緒に使いたい」という場面がよくあります。

そんな時に便利なのが .enumerated() です。

この記事では、.enumerated() の基本的な意味・使い方、活用時の注意点を、なるべくわかりやすく解説します。

.enumerated()とは?

.enumerated() は Swift の標準ライブラリに用意されているメソッドで、配列などのコレクションを 「(インデックス, 要素) の組み合わせ」 に変換してくれる機能です。

通常の for-in ループでは要素だけを取り出しますが、.enumerated() を使うと その要素が配列の何番目か まで一緒に扱えるようになります。

  • 普通の for-in → 要素だけ
  • .enumerated() → インデックスと要素のペア

この違いを理解することで、より柔軟にループ処理をコントロールできます。

具体例:配列の要素とインデックスを同時に取得する

配列のフルーツ名をインデックス付きで表示するSwiftUIの具体例で、.enumerated()の挙動を確認しましょう。

enumerated1

【コードのポイント】

  • .enumerated() は (インデックス, 要素) のペアを返す
    → 通常の for-in では要素だけを扱いますが、.enumerated() ではインデックス(配列の中の順番)も一緒に取得できます。

  • (index, fruit) の形でタプルを展開して使う
    index が位置番号、fruit が実際の要素になります。

  • ③ インデックスは常に 0 から始まる
    → Swift の配列インデックスは 0 スタートなので、.enumerated() でも同様です。

  • result += で文字列を結合して出力用テキストを作成
    → 各ループで1行ずつ追加して、最終的にまとめて結果を返しています。

  • ⑤ SwiftUIの Text(showFruits()) で関数結果を画面に表示
    → 通常の print() 出力ではなく、UI上に結果を表示できるようにしています。

Swiftの配列インデックスは 0 スタートなので、enumerated() でも同じルールでインデックスが割り振られます。

具体例: ForEachとの組み合わせ

SwiftUI では、ループ構文の for の代わりに ForEach を使ってビューを繰り返し生成します。

この時、 .enumerated() を組み合わせることで、インデックスと要素の両方を同時に扱うUI表示が簡単に作れます。

たとえば、配列の要素(フルーツ名)を番号付きでリスト表示したい場合には次のように書けます。

enumerated2

【コードのポイント】

  • ForEach は SwiftUI で繰り返しUIを生成する構文
    → 通常の for 文は View の中では使えないため、SwiftUIでは ForEach を使用します。

  • .enumerated() によって (index, element) のペアを取得
    index が配列の位置番号、fruit が実際の要素として取り出せます。

  • Array(...).enumerated() の結果を「配列」に変換する
    .enumerated() の戻り値はシーケンス(順番に取り出せるけど、配列ではない特別な型)です。
    しかし、SwiftUI の ForEach明確な配列やIDの一覧 が必要なので、そのままだと使えません。そのため、ForEach で扱うために Array() で包むことでシーケンスを配列に変換しています。

  • id: \.element で一意のIDを指定
    fruit がユニークな文字列であれば、そのまま識別子に使えます。
    (重複の可能性がある場合は \.offset を使うのがおすすめです)

  • ⑤ インデックスをUI表示に利用
    Text("\(index). \(fruit)") のように、インデックスを直接テキストに含めることで、番号付きリストを簡単に作れます。

.enumerated() の戻り値の型

.enumerated() の戻り値は EnumeratedSequence<Array<Element>> という特殊なシーケンス型です。

少し難しく見えますが、これは「配列の中身を (番号, 要素) のペアとして順番に返す仕組み」だと考えてOKです。

つまり、enumerated() を使うと 要素のインデックス番号と値をセットにしたタプル を順番に受け取れるようになります。

例えば、次のようにも書けます。

出力結果

【コードのポイント】

  • .enumerated() が返すのは、(Int, Element) の形をしたタプルの連続(シーケンス)です。
    → 上の例では (0, "Apple"), (1, "Banana"), (2, "Orange") というデータが順番に渡されます。

  • pair.0 がインデックス番号、pair.1 が配列の要素です。
    → つまり「0番目の要素はApple」「1番目の要素はBanana」といった情報を同時に取得できます。

ただし、pair.0pair.1 と書くよりも (index, fruit) のように変数名をつけて展開するほうが可読性が高くおすすめです。

活用シーン

.enumerated() は「インデックスが必要なループ処理」にぴったりです。

次のようなケースで特に役立ちます。

  • 番号付きリストを表示したいとき
    → 例:ショッピングリストやタスク一覧に「1. ○○」のような番号をつけたいとき。
  • インデックスを使って条件分岐したいとき
    → 例:偶数番目だけ処理を変える、最初の要素だけ強調表示するなど。
  • 配列の要素を更新したいとき
    → 例:for (index, value) in array.enumerated() を使えば、配列を直接更新できます。

実際の例を見てみましょう。

通常の for value in numbers では要素のコピーしか扱えませんが、enumerated() なら元の配列のインデックスを直接参照して値を更新できます。

注意点

便利な .enumerated() ですが、使うときに気をつけたいポイントもあります。

  • インデックスは常に0から始まる
    → 番号を1から始めたい場合は index + 1 として調整しましょう。
    例:print("\(index + 1). \(fruit)")
  • 必要ないときは使わない
    → インデックスを使わない場合は .enumerated() を使う意味がありません。
    単純なループでは通常の for-in を使う方が読みやすく効率的です。
  • インデックスは Int 型で固定
    → コレクションの実際のインデックス型が Int でなくても、.enumerated() は常に 0 からの Int で割り振られます。
    そのため、特定の型付きインデックスが必要な場合は別の方法を検討しましょう。

まとめ

.enumerated() は、配列のインデックスと要素を同時に扱いたい時に非常に便利なメソッドです。

インデックスを含むループ処理を簡潔に書けるため、コードの見通しが良くなります。

  • .enumerated() はインデックスと要素を同時に取り出せる。
  • 戻り値は (Int, Element) のタプル。
  • 番号付きリスト表示や配列の要素更新に活用できる。
  • インデックスは必ず0から始まり、Int型で連番になる。

これを覚えておくと、配列を扱う時にできることの幅が広がりますよ!

ぜひ参考にしてみてくださいね!

おすすめの記事