使用 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)
            }
        }
    }