異なるViewを返すプロパティ
異なるViewを返すプロパティを定義する際、Viewの型が異なることから無理やりAnyViewなどでWrapする方法が思い浮かびますがどうもスマートではありません…
var viewProp: AnyView {
if state {
return AnyView(Rectangle())
} else {
return AnyView(Circle())
}
}
これはViewBuilder
attributeを利用することで解決出来ます。
この場合、return文も必要ありません。
@ViewBilder
var viewProp: some View {
if state {
Rectangle()
} else {
Circle()
}
}
上記の例だとViewBuilder.buildEither
によって単一の型として解決されるために、このような記法が可能になります。
条件に合った時だけViewを返すプロパティ
異なるViewを返すプロパティを定義する際、非表示用にEmptyViewを返し、表示用のViewを返す処理を書くことを思い浮かべますがこれらは型が異なるのでAnyViewでWrapするしかありません。
やはりスマートではありません…
この例でもViewBuilder
attributeが利用出来ます。
// Before
var viewProp: AnyView {
if state {
AnyView(Rectangle())
} else {
AnyView(EmptyView())
}
}
// After
@ViewBilder
var viewProp: some View {
if state {
Rectangle()
}
// 条件に当てはまらない時はEmptyViewになる
}
上記の例だとViewBuilder.buildIf
によって単一の型として解決されるために、このような記法が可能になります。