我在Swift 3中有一个简单的二维数组,如下所示:
let myData = [[1, 2],[3, 4]]
我希望能得到的是一个表示垂直列的简单Slice,所以例如切片第一列会给我一个内容为[1, 3]
的ArraySlice。
我希望能够使用一些简单的语法在数组中生成Slice,如下所示:
let sliceCol = myData[0...1][0]
或
let sliceRow = myData[0][0...1]
但两行代码都评估为只是其中一行的切片(在两种情况下结果都是[1, 2]
)。
使用Swift阵列进行搜索会得到很多结果,但是在Swift中使用多维数组似乎不是很多例子。我可以简单地遍历数组并使用给定的列条目构建一个新数组,但我认为必须有一种有效的方法从Swift 3中的多维数组中获取切片。
答案 0 :(得分:2)
这实际上不是一个二维数组。这是一个数组数组。有时人们试图将其视为2D阵列,但它确实非常不同。例如,每行不必具有相同数量的元素。由于写时复制行为,在Swift中改变这些数据结构往往非常昂贵。正如您所见,即使访问它也可能效率很低。 stdlib不包含真正的多维数组。
如果您正在做需要真正二维数组的事情,那么您将需要一个数据结构。对于小矩阵,我建议查看GLKit,其中包括3x3和4x4 Floats矩阵。您还可以查看包含多种矩阵类型的simd
。
如果您的需求比这更普遍,那么您真的想要构建自定义Matrix
类型。有很多examples on GitHub。如果您对此非常认真,那么您可能希望寻找能够维护自己的写时复制后备存储并且内部不使用[[T]]
的内容。