我有这段代码:
var triangles: [[[CAShapeLayer]]] = Array(repeating: Array(repeating: Array(repeating: 0, count: 2), count: 15), count: 15);
但它会生成“无法转换类型的值......”编译错误。
我该如何解决?我想这样访问我的CAShapeLayers:
triangles[1][2][1].fillColor = UIColor(red: 40/255, green: 73/255, blue: 80/255, alpha: 1).cgColor;
答案 0 :(得分:1)
使用选项。
var triangles: [[[CAShapeLayer?]]] = Array(repeating: Array(repeating: Array(repeating: nil, count: 2), count: 15), count: 15)
现在有一个零而不是0,这是我认为你暗示的。但是每个triangles[x][y][z]
现在都是一个可选类型,你必须安全地打开它。
因此,在对该对象执行任何操作之前,您必须执行triangles[x][y][z] = CAShapeLayer()
之类的操作。
编辑进行更正。谢谢@OOPer
我想到了更多,并意识到我没有真的回答你的问题。
因此,您可以使用for循环来初始化所有内容(这会很麻烦),或者每次访问索引时都可以执行类似的操作:
if triangles[x][y][z] == nil
{
triangles[x][y][z] = CAShapeLayer()
}
let bloop = triangles[x][y][z]!
bloop.fillColor = UIColor(...
然后你可以把它拉到外面的方法,所以它变成了1个班轮。像:
func tri(at x: Int, _ y: Int, _ z: Int) -> CAShapeLayer
{
if triangles[x][y][z] == nil
{
triangles[x][y][z] = CAShapeLayer()
}
return triangles[x][y][z]!
}
然后使用它时:
tri(at: 1, 2, 1).fillColor = ...
当然,您应该将triangles
拉出来并使其成为您所在班级的属性,或者您可以将其包含在该1班组法的参数列表中。
答案 1 :(得分:0)
所有嵌套都会让您的代码难以理解,Array(repeating:count:)
无法做到您想要的。
func newGrid() -> [[[CAShapeLayer]]] {
func newStack() -> [CAShapeLayer] {
return (0 ..< 2).map({ _ in CAShapeLayer() })
}
func newRow() -> [[CAShapeLayer]] {
return (0 ..< 15).map({ _ in newStack() })
}
return (0 ..< 15).map({ _ in newRow() })
}
var triangles = newGrid()
答案 2 :(得分:0)
您不能使用“0”作为重复值,它将被推断为类型[[[Int]]]。只需将“0”替换为“CAShapeLayer()”
即可