前回リスト用のデータを追加しましたが、表示の切り替えやセクションわけができませんでした。今回はデータに種別を追加して、表示の出しわけをしてみようと思います。
- 前回のコードに続けて書く
- 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