ずっとコピペで使ってはいたけど、結局これが何なのかがわからず、1年経過したけど、いい加減自分でも使えるようにならないといけないと思い、簡単に言うと何なの?で調べたのでメモ

viewをまとめて返せるような仕組み。再利用しやすいように

htmlではよくあるんだけど、例えばメニューバーがあって。アイテムが3つ並んでいる。

こういう場合、もしかしたらメニューそのまま、でも横だったり縦にしたかったりする。

そんな時、毎度記述するのはさすがに保守性が悪すぎる

struct MyView: View {
    @ViewBuilder
    var content: some View {
        Text("Header")
        Divider()
        Text("Footer")
    }

    var body: some View {
        VStack {
            content
        }
    }
}

@ViewBuilder の直後にあるプロパティだったり、メソッドについては、
こういう風に複数viewを返すことを許諾できる。

Vstack をHStackにすると、縦並びが横並びにTextが配置されると、色々便利

メソッドで書いてみる

上記はプロパティでサンプルだったので、今度はメソッドにViewBuilderをあててみる

@ViewBuilder
func sampleView() -> some View {
    Text("Hello")
    Text("World")
}

struct MyContent: View {
    var body: some View {
        VStack {
            sampleView()
        }
    }
}

あくまでViewBuilderの直後のみがViewBuilderとしての有効範囲。

もう1つメソッドを追加する場合は、そのメソッドにもViewBuilderをつけておく

コメント