【问题标题】:How to return different Views from switch case如何从开关盒返回不同的视图
【发布时间】:2020-06-21 20:14:56
【问题描述】:

我的 SwiftUI 代码中有这个功能

func getShape(shape:Int, i: Int) -> some View {
    switch self.selectedShape {
    case 0:
        return Rectangle()
               .stroke(Color.pink)
               .frame(width: 150, height: 150)
               .position(CGPoint(x: scrCenterX, y: scrCenterY))
               .rotationEffect(Angle(degrees: Double(i) * Double(self.angleStep)))
    case 1:
        return Circle()
               .stroke(Color.pink)
               .frame(width: 150, height: 150)
               .position(CGPoint(x: scrCenterX, y: scrCenterY))
            .rotationEffect(Angle(degrees: Double(i) * Double(self.angleStep)))
    case 2:
        return Capsule()
               .stroke(Color.pink)
               .frame(width: 150, height: 150)
               .position(CGPoint(x: scrCenterX, y: scrCenterY))
            .rotationEffect(Angle(degrees: Double(i) * Double(self.angleStep)))
    default:
        return Rectangle()
        .stroke(Color.pink)
        .frame(width: 150, height: 150)
        .position(CGPoint(x: scrCenterX, y: scrCenterY))
            .rotationEffect(Angle(degrees: Double(i) * Double(self.angleStep)))
    }
}

并且编译器说“函数声明了一个不透明的返回类型,但它的主体中的返回语句没有匹配的底层类型”。如果我将所有“案例”形状更改为例如Circle 然后代码编译没有任何错误。我如何根据 selectedShape 值冷实现返回形状? 谢谢。

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    some View 是一个不透明(对调用者)返回类型,它是某种符合 View 的类型。但它必须是被调用者在编译时知道的特定类型。

    因此,在编译时,您需要确定符合 View 的具体类型。不能是RectangleCircle;它总是需要是相同的类型。因此,对于不透明类型,您尝试做的事情(按设计)是不可能的。

    相反,您需要在AnyView 中输入erase:

    func getShape(shape:Int, i: Int) -> AnyView {
    
       switch self.selectedShape {
       case 0: return AnyView(Rectangle()
                              .stroke(Color.pink)
                              .frame (...)
                              )
       case 1: return AnyView(Circle()
                              .stroke(Color.pink)
                              .frame (...)
                              )
       // etc...
    }
    

    【讨论】:

      【解决方案2】:

      保留原来的类型:

      您应该使用自定义视图构建器实现自定义视图,以便可以返回不同的类型:

      所以实现这个:

      struct Shape: View {
          let selected: Int
      
          @ViewBuilder var body: some View {
              switch selected {
              case 0: Rectangle()
              case 1: Circle()
              case 2: Capsule()
              default: Rectangle()
              }
          }
      }
      

      那么你可以拥有这个:

      func getShape(shape:Int, i: Int) -> some View {
          Shape(selected: shape)
              .stroke(Color.pink)
              .frame(width: 150, height: 150)
              .position(CGPoint(x: scrCenterX, y: scrCenterY))
              .rotationEffect(Angle(degrees: Double(i) * Double(self.angleStep)))
      }
      

      请注意,Swift 5.3 (Xcode 12) 中无需编写 @ViewBuilder

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-04
        • 2012-03-25
        • 2016-09-24
        • 1970-01-01
        • 2011-04-02
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多