我已经用SwiftUI创建了一些Shapes,我想将它们保存在数组中,这样我就可以遍历它们并在View中显示它们。
let diceShapes: [Shape] = [Triangle(), Pentagon(), ....]
但是,保存数组时我收到一条错误消息协议'Shape'只能用作通用约束,因为它具有Self或关联的类型要求。
Shape本身没有任何关联类型,但是Shape符合View和Animatable,它们都具有一种关联类型,所以我想这就是问题!!我考虑过要添加一个符合Shape的结构或类似内容,但无法使其正常工作。它不必是数组,我对应该返回类似Shape的函数也有同样的问题。 谢谢。
答案 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()
}
}
}