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

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

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

【SwiftUI】ForEachの使い方(1/2)
ForEachは繰り返し処理の中で、Viewを生成する仕組みです。たとえば、名前の配列をループしてそれぞれをTextViewにしたり、メニュー項目に追加したりする事ができます。さらに良いことに、ForEachは、Viewを手動で追加した...

スポンサーリンク

環境

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

【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に関しては、明示的に準拠しておかないとコンパイル時にエラーになります。

SwiftUI
スポンサーリンク
スポンサーリンク
カピ通信

コメント