【Swift】enumeratedの使い方!配列のインデックスを取得する

この記事からわかること

  • Swift配列インデックス取得する方法
  • enumeratedメソッド使い方
  • ArraySlice扱う際の注意点
  • zipメソッドの使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

enumeratedメソッドで配列のインデックスを取得する

公式リファレンス:enumerated

func enumerated() -> EnumeratedSequence<Self>

Swiftのenumeratedコレクション内の要素とインデックスをペアとして返すメソッドです。返り値のEnumeratedSequence型は要素(x)とインデックス(n)をペアにした(n,x)型のシーケンスです。

let fruits = ["Apple", "Banana", "Orange"]

for (index, fruit) in fruits.enumerated() {
    print("Index: \(index), Fruit: \(fruit)")
}

正確にはインデックスではない

公式リファレンスを読んでいると「ペアの整数部分は列挙のカウンターであり、必ずしもインデックスではない」と記述されておりました。

When you enumerate a collection, the integer part of each pair is a counter for the enumeration, but is not necessarily the index of the paired value.

引用:公式リファレンス

例えばSet型のコレクションの場合、enumeratedではNo exact matches in call to subscriptというエラーになります。

let names: Set = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
for (i, _) in names.enumerated() {
    print(names[i]) // No exact matches in call to subscript
}

このインデックスを取得したい場合はzipメソッドを使用してねと公式に記述されていました。

let names: Set = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]

for (i, _) in zip(names.indices, names) {
    print(names[i])
}

また普通の配列でもdropFirstなどを使用た返り値がArraySlice型になる場合は範囲外のエラーになってしまいます。

let fruits = ["Apple", "Banana", "Orange"].dropFirst()

for (index, _) in fruits.enumerated() {
    print(fruits[index]) // Index out of bounds
}

これはArraySlice自体の特徴で元になった配列のindexを保持するコレクション型だからです。そのため必ず[0]が存在するわけではないからであり、enumeratedは対象のコレクションのインデックスとは関係ないただの個数のカウンターなので範囲外でエラーになってしまうようです。

公式リファレンス:Slices-Maintain-Indices

Array(配列)に変換する

enumeratedメソッドの返り値はEnumeratedSequence型になるので配列などに戻すにはmapelementプロパティの配列を作り直せばOKです。

let fruits = ["Apple", "Banana", "Orange"]

let enumList = fruits.enumerated()
print(type(of: enumList)) // EnumeratedSequence<Array<String>>

let array = enumList.map({ $0.element })
print(type(of: array))    // Array<String>

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index