前回リスト用のデータを追加しましたが、表示の切り替えやセクションわけができませんでした。今回はデータに種別を追加して、表示の出しわけをしてみようと思います。
- 前回のコードに続けて書く
 - PhotoDataに変数 type を増やす
- typeは「データの種類」
 
 
まず、データの種類がわかるようにPhotoDataを改良します。追加位置は自由ですが、下記の例ではidとimageNameの間に入れています。
コード1
 | 
 | 
PhotoDataの構造を変えたので、ContentViewでPhotoDataを使う時typeの値を求められます。 それぞれのPhotoDataがどんな種類のデータであるか、typeに入力していきます。
- ContentViewのphotos:[PhotoData]の各情報にtypeを追加する
- 景色のデータは type:”景色” と書く
 - 食べ物のデータは type:”食べ物” と書く
 
 
コード2
 | 
 | 
この段階では表示に変化はありません。
結果1
配列.filterでの絞り込み
では、このデータのtypeを用いて表示を工夫したいと思います。 データのtypeが"景色"であるものに絞り込みます。配列の.filter を用いることで条件に合わせてデータを絞れます。
- ContentViewのForEachで用いる配列を書き換える
 - photos.filter { $0.type == “景色” } と書く
- type = ”景色”のデータのみの配列 が得られる
 
 
コード3
 | 
 | 
結果2
次にfilterで表示されなくなった食べ物データを表示したいと思います。しかし景色とは別の表示にしたいので、 FoodAndDrinkRow を使います。FoodAndDrinkRowでPhotoDataを受け取れるように改造します。
- 
FoodAndDrinkRowの受け取る値を, data:PhotoData に変更
- 受け取る値にしていたimageName, title, messageは削除する
 
 - 
値の使用部分をPhotoDataの値を使うように変更する
- imageName -> data.imageName
 - title -> data.title
 - message -> data.message
 
 
コード4
 | 
 | 
さて、ここまでで準備が整いました。 ContentViewのListに食べ物セクションを追加し、typeが"食べ物"になっているものに絞ってリストに使ってみましょう。
- ContentViewのListに食べ物Sectionを追加
- ForEachでFoodAndDrinkRowを繰り返し作る
 - photos.filter { $0.type == “食べ物” } でデータを絞る
 
 
コード5
 | 
 | 
食べ物が異なる表示でリスト化されました。
同じデータ配列にまとめていても、filter をうまく使うことでデータを使い分けることができました。
結果3