【问题标题】:Array of shapes - Protocol can only be used as a generic constraint形状数组 - 协议只能用作通用约束
【发布时间】:2020-04-18 04:42:11
【问题描述】:

我已经使用 SwiftUI 创建了一些形状,我想将它们保存在一个数组中,这样我就可以循环它们并在视图中显示它们。 let diceShapes: [Shape] = [Triangle(), Pentagon(), ....]

但是,我在保存数组时收到一条错误消息Protocol 'Shape' 只能用作通用约束,因为它具有 Self 或关联的类型要求

Shape 本身没有任何关联类型,但 Shape 符合 View 和 Animatable 两者都有一个关联类型,所以我想这就是问题所在!?我考虑过添加一个符合 Shape 的结构或类似的东西,但我无法让它工作。它不必是一个数组,我对应该返回类似形状的函数有同样的问题。 谢谢。

【问题讨论】:

    标签: ios swift generics swiftui


    【解决方案1】:

    将它们包裹成AnyView类型的橡皮擦,就像

    let diceShapes: [AnyView] = [AnyView(Triangle()), AnyView(Pentagon()), ....]
    

    【讨论】:

      【解决方案2】:

      我找到了一种不科学的方法来实现这一点。我是初学者,不知道会有什么后果。如果有什么事情,请告诉我。

      extension Int: Shape{
      public func path(in rect: CGRect) -> Path {
          Path { path in
              let width: CGFloat = rect.width
              let height: CGFloat = rect.height
      
              switch self {
              case 0:
                  path.addArc(
                      center: CGPoint(x: width/2, y: height/2),
                      radius: CGFloat.minimum(width, height) / 2,
                      startAngle: .degrees(0),
                      endAngle: .degrees(360),
                      clockwise: true
                  )
              case 1:
                  path.addLines(SquarePoints(width,height))
              case 2:
                  path.addLines(DiamondPoints(width,height))
              case 3:
                  path.addLines(SixSidePoints(width,height))
              case 4:
                  path.addLines(EightSidePoints(width,height))
              case 5:
                  path.addLines(FiveSidePoints(width,height))
              case 6:
                  path.addLines(UnFiveSidePoints(width,height))
              default:
                  path.addLines(SquarePoints(width,height))
              }
      
              path.closeSubpath()
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 2016-02-18
        相关资源
        最近更新 更多