【SwiftUI】ForEachの使い方(2/2)

ForEachの繰り返し処理にて出力したデータを変更(削除、並び替え)できるようにするには、SwiftUIが該当データを識別する為に、各要素の一意性が保証されている必要があります。
本記事(2/2)では、各要素の一意性を保証したデータコレクションを渡す方法【データ指定】について解説します。

こちらの記事も合わせてお読み下さい。

【SwiftUI】ForEachの使い方(1/2)
(2023/09/18 更新) ForEachは繰り返し処理の中で、Viewを生成する仕組みです。文字列の入った配列をループしてそれぞれをTextViewに変換する、またはメニュー項目に追加するような動きを実現します。さらに、ForEach...

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】11.2.1
【Swift】5.1
【iOS】13.2.2
【macOS】Catalina バージョン 10.15.2
スポンサーリンク

Identifiableプロトコルについて

Swiftにはデータを識別可能にするためにIdentifiableプロトコルが用意されています。
このプロトコルに準拠したクラスやStructは一意に識別できる事を保証します。
プロトコルの要件として、識別子であるプロパティ(id)を必ず有する必要があります。
idは手動で設定もできますが、ユニークなIDを生成するUUID()を利用して自動で設定するのがお勧めです。

idを手動で設定する場合は、各要素が必ず一意になるように注意して下さい。
万が一idが重複した場合、それだけでエラーにはなりませんが、Swiftは一意である前提で動作しますので、予期しない問題が発生します。

スポンサーリンク

Identifiableプロトコルに準拠したデータコレクションを渡す

ForEachにIdentifiableプロトコルに準拠したデータコレクションを渡すだけで、全要素に対して繰り返し処理を実行します。

【図1:Identifiableプロトコルに準拠したデータコレクションを渡す】

スポンサーリンク

Identifiableプロトコルに準拠していないデータコレクションを渡す

Identifableに準拠していないデータコレクションを渡す場合は、idの代わりとなるプロパティを指定して、一意性の保証を担保します

次のサンプルソースは、プロパティ(code)をidの代わりに使用した例です。

idの代わりに.selfを渡す

各要素のインスタンスを示す.selfも、該当要素を識別するidとして利用できます。
これを利用して、配列を一意性を保証したデータコレクションとして渡せます。

structの.selfを渡す場合の注意点

ForEachの引数idに渡す値はHashableプロトコルに準拠している必要があります。
Swift標準の型は概ねHashableに準拠していますので、普段はあまり意識する必要がありませんが、自分で型を生成するstructに関しては、明示的に準拠しておかないとコンパイル時にエラーになります。

対象のプロパティがHashableでない場合、次のようなエラーメッセージが出ます。

スポンサーリンク

あわせて読みたい記事

【SwiftUI】ForEachの使い方(1/2)
(2023/09/18 更新) ForEachは繰り返し処理の中で、Viewを生成する仕組みです。文字列の入った配列をループしてそれぞれをTextViewに変換する、またはメニュー項目に追加するような動きを実現します。さらに、ForEach...
【SwiftUI】Listの使い方
(2022/03/09 更新) Listはデータの一覧表示をするのに適したViewです。 画面に収まらない量の場合はスクロール表示になるなど、UIKitのUITableViewに似ていますが、はるかに簡単に使えます。 ListはForEac...
【SwiftUI】Formの使い方
(2021/09/26 更新) Formは設定画面などのデータ入力に使用するコントロールをグループ化するコンテナとして使用します。