SwiftUI/ForEach.init(subviews:content:)
#SwiftUI
WWDC
Demystify SwiftUI containers - WWDC24 - Videos - Apple Developer
ForEach.init(subviews:content:)
init(subviews:content:) | Apple Developer Documentation
サンプルコード
https://developer.apple.com/documentation/SwiftUI/Creating-custom-container-views
使ってみる
code:swift
import SwiftUI
struct ContentView: View {
var titles: String = [
"a",
"bb",
"ccc",
"dddd",
"eeeee"
]
var numbers: Int = [
1,
22,
333,
4444,
55555
]
var body: some View {
List {
Group(subviews: content) { subviews in
ForEach(subviews: subviews) { subview in
subview
// subviews.count を使ったりできる
}
}
}
}
@ViewBuilder
var content: some View {
ForEach(titles, id: \.self) { title in
Text(title)
}
ForEach(numbers, id: \.self) { number in
Text("\(number)")
}
}
}
https://scrapbox.io/files/66f0f76ae8ae07001c1ce369.png
メモ
あまり使うケースが想定できない
最終的に ForEach(subviews:) を使うことで最終的なResolved subViewsが分かるのは良い
ForEachを入れ子にしてもsubviewsとしては孫の数がカウントされる
以下を Groups(subviews:) で使用すると個数は8になる
code:swift
@ViewBuilder
var content: some View {
ForEach(titles, id: \.self) { title in
Text(title) // 2 times
}
ForEach(numbers, id: \.self) { number in // 3 times
ForEach(titles, id: \.self) { title in
Text(title) // 2 times
}
}
}
今までのForEachはデータを渡していたが、今回のはviewを渡せるようになっている