形状数组-协议只能用作一般约束

时间:2019-12-28 18:38:58

标签: ios swift generics swiftui

我已经用SwiftUI创建了一些Shapes,我想将它们保存在数组中,这样我就可以遍历它们并在View中显示它们。 let diceShapes: [Shape] = [Triangle(), Pentagon(), ....]

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

Shape本身没有任何关联类型,但是Shape符合View和Animatable,它们都具有一种关联类型,所以我想这就是问题!!我考虑过要添加一个符合Shape的结构或类似内容,但无法使其正常工作。它不必是数组,我对应该返回类似Shape的函数也有同样的问题。 谢谢。

2 个答案:

答案 0 :(得分:1)

将它们包装到AnyView型橡皮擦中,例如

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

答案 1 :(得分:-1)

我找到了一种不科学的方法来实现这一目标。我是初学者,所以我不确定会产生什么后果。如果有什么事情发生,请告诉我。

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

}