使用 SwiftUI 展平 TupleView
Flatten TupleViews using SwiftUI
好的,SwiftUI 已于本周发布,所以我们都是新手,但是...我有以下测试代码:
var body: some View {
switch shape {
case .oneCircle:
return ZStack {
Circle().fill(Color.red)
}
case .twoCircles:
return ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}
产生以下错误:
函数声明了一个不透明的 return 类型,但其主体中的 return 语句没有匹配的基础类型
发生这种情况是因为第一个 ZStack 是这种类型:
ZStack<ShapeView<Circle, Color>>
第二个是这种:
ZStack<TupleView<(ShapeView<Circle, Color>, ShapeView<Circle, Color>)>>
我如何在 SwiftUI 中处理这个问题?它们能否以某种方式被压扁或符合相同的类型。
解决此问题的一种方法是使用类型橡皮擦 AnyView
:
var body: some View {
switch shape {
case .oneCircle:
return AnyView(ZStack {
Circle().fill(Color.red)
})
case .twoCircles:
return AnyView(ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
})
}
}
您还可以使用 Group,它是逻辑容器,因此不会改变任何视觉效果。
var body: some View {
Group {
switch shape {
case .oneCircle:
return ZStack {
Circle().fill(Color.red)
}
case .twoCircles:
return ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}
}
我知道这是一个老问题。但是我偶然发现了它,现在正确的方法是使用 @ViewBuilder
注释(注意缺少的 return
):
@ViewBuilder var body: some View {
switch shape {
case .oneCircle:
ZStack {
Circle().fill(Color.red)
}
case .twoCircles:
ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}
或者在这种特定情况下,分解出 ZStack
:
var body: some View {
ZStack {
switch shape {
case .oneCircle:
Circle().fill(Color.red)
case .twoCircles:
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}
好的,SwiftUI 已于本周发布,所以我们都是新手,但是...我有以下测试代码:
var body: some View {
switch shape {
case .oneCircle:
return ZStack {
Circle().fill(Color.red)
}
case .twoCircles:
return ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}
产生以下错误:
函数声明了一个不透明的 return 类型,但其主体中的 return 语句没有匹配的基础类型
发生这种情况是因为第一个 ZStack 是这种类型:
ZStack<ShapeView<Circle, Color>>
第二个是这种:
ZStack<TupleView<(ShapeView<Circle, Color>, ShapeView<Circle, Color>)>>
我如何在 SwiftUI 中处理这个问题?它们能否以某种方式被压扁或符合相同的类型。
解决此问题的一种方法是使用类型橡皮擦 AnyView
:
var body: some View {
switch shape {
case .oneCircle:
return AnyView(ZStack {
Circle().fill(Color.red)
})
case .twoCircles:
return AnyView(ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
})
}
}
您还可以使用 Group,它是逻辑容器,因此不会改变任何视觉效果。
var body: some View {
Group {
switch shape {
case .oneCircle:
return ZStack {
Circle().fill(Color.red)
}
case .twoCircles:
return ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}
}
我知道这是一个老问题。但是我偶然发现了它,现在正确的方法是使用 @ViewBuilder
注释(注意缺少的 return
):
@ViewBuilder var body: some View {
switch shape {
case .oneCircle:
ZStack {
Circle().fill(Color.red)
}
case .twoCircles:
ZStack {
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}
或者在这种特定情况下,分解出 ZStack
:
var body: some View {
ZStack {
switch shape {
case .oneCircle:
Circle().fill(Color.red)
case .twoCircles:
Circle().fill(Color.green)
Circle().fill(Color.blue)
}
}
}