Ios 使用SwiftUI展平TupleViews
好的,SwiftUI本周发布了,所以我们都是N00B,但是。。。我有以下测试代码: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
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:
圆圈().填充(颜色为红色)
案例.两个圆圈:
圆圈().填充(颜色.绿色)
圆圈().填充(颜色.蓝色)
}
}
}
这个答案“有效”,但如果答案正确,是否有人可以考虑一下,如果正确,为什么有效?