Ios 使用SwiftUI展平TupleViews

Ios 使用SwiftUI展平TupleViews,ios,swift,swiftui,Ios,Swift,Swiftui,好的,SwiftUI本周发布了,所以我们都是N00B,但是。。。我有以下测试代码: var body: some View { switch shape { case .oneCircle: return ZStack { Circle().fill(Color.red) } case .twoCircles: return ZStack { Circle().fill(Col

好的,SwiftUI本周发布了,所以我们都是N00B,但是。。。我有以下测试代码:

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)
        }
    }
}
这将产生以下错误:

函数声明不透明的返回类型,但其主体中的返回语句没有匹配的基础类型

发生这种情况是因为第一个ZStack是这种类型:

ZStack<ShapeView<Circle, Color>>
ZStack<TupleView<(ShapeView<Circle, Color>, ShapeView<Circle, Color>)>>
ZStack
第二种是这种类型:

ZStack<ShapeView<Circle, Color>>
ZStack<TupleView<(ShapeView<Circle, Color>, ShapeView<Circle, Color>)>>
ZStack

在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)
        })
    }
}

您还可以使用组,该组是逻辑容器,因此不会更改任何可视内容

 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变量body:some视图{
开关形状{
案例1.oneCircle:
ZStack{
圆圈().填充(颜色为红色)
}
案例.两个圆圈:
ZStack{
圆圈().填充(颜色.绿色)
圆圈().填充(颜色.蓝色)
}
}
}
或者在这种特定情况下,将
ZStack

var主体:一些视图{
ZStack{
开关形状{
案例1.oneCircle:
圆圈().填充(颜色为红色)
案例.两个圆圈:
圆圈().填充(颜色.绿色)
圆圈().填充(颜色.蓝色)
}
}
}

这个答案“有效”,但如果答案正确,是否有人可以考虑一下,如果正确,为什么有效?