NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

【SwiftUI】ForEachでPixel Artアプリを作ってみる

概要

SwiftUIではForEachを使用することでViewを繰り返し処理で生成することができます。
そんなForEachの使い方をご紹介しつつ今回は以下のようにドット絵が描けるPixel Artアプリを作ってみたいと思います。

環境

この記事は以下のバージョン環境のもと作成されたものです。
【Xcode】14.0
【iOS】16.0
【macOS】Monterey バージョン 12.5

ForEachの基本的な使いかた

VStack {
    ForEach(0..<10) { index in
        Text("Index: \(index)")
    }
}

ForEachは繰り返しViewを生成するのでListやVStack内で使用します。
基本的な使い方は()内に繰り返したい範囲を記述し、クロージャー内でViewを書きます。
上記のサンプルではVStackで縦に配列するコンテナ内にForEachでTextを繰り返し生成している状態です。

配列やIdentifiable、cに準拠したデータを使う

ForEachの()に配列のデータを渡すこともできます。

struct SampleView: View {
    let fruits: [String] = ["Apple", "Orange", "Banana", "Pineapple"]
    var body: some View {
        VStack {
            ForEach(fruits, id: \.self) { index in
                Text(index)
            }
        }
    }
}

配列のデータを範囲に渡し、第二引数でid: .selfとしてIDを渡しています。
この配列にはIDの情報がないので必ず必要となります。
またクロージャーのindexは配列で定義した型になるのでString型となるのでText内でそのまま使用することができます。

structを利用した配列を利用する場合は必ずHashableに準拠させる必要があります。

struct FruitsData: Hashable {
    var name: String
}

struct SampleView: View {
    let fruits: [FruitsData] = [
    FruitsData(name: "りんご"),
    FruitsData(name: "みかん"),
    FruitsData(name: "バナナ"),
    FruitsData(name: "パイナップル")
    ]
    var body: some View {
        VStack {
            ForEach(fruits, id: \.self) { fruits in
                Text(fruits.name)
            }
        }
    }
}

Identifiableに準拠したstructの型で配列のプロパティを渡すと第二引数でのIDを省略することができます。

struct FruitsData: Identifiable {
    var id: String { name }
    var name: String
}

struct SampleView: View {
    let fruits: [FruitsData] = [
    FruitsData(name: "りんご"),
    FruitsData(name: "みかん"),
    FruitsData(name: "バナナ"),
    FruitsData(name: "パイナップル")
    ]
    var body: some View {
        VStack {
            ForEach(fruits) { fruits in
                Text(fruits.name)
            }
        }
    }
}

Identifiableに準拠したstructは必ずIDが保証されたているのでForEachでIDを定義しなくてもよくなります。
またIDの省略だけでなく、サーバーからデータを取得して、取得したデータの値をList形式で表示させたりする時は非常に簡単にできます。

Pixel Artアプリを作ってみる

ForEathでVStackとHStackにRectangleを表示させることで、ほんの数行で10×10のマスを作ることができます。
またちょっとしたカーソルボタンを作成し、選択しているIndexに色を付けることで、マスを移動しているように表示させています。
全体のコードでも100行ちょっとだけで作ることができます。
以下サンプルコードのリンクを貼っておくので是非手元で試して見てください!

github.com

まとめ

  • ForEachで繰り返しViewを生成することができる。
  • 繰り返しの範囲には配列を渡すことができる。
  • Identifiableに準拠したstructを使用するとIDを省略することができる。

執筆者岡優志

iOSエンジニア
iOSを専門とし、モバイルアプリの開発を行なっています。

Twitter