如何创建CAShapeLayers矩阵?

时间:2017-08-17 23:01:21

标签: swift cashapelayer

我有这段代码:

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;

3 个答案:

答案 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()”

即可