是的,没有任何内置的东西(据我所知)。您可以定义自定义类/结构(如在 Swift 中访问多维数组的最有效方法? https://stackoverflow.com/questions/27139437/most-efficient-way-to-access-multi-dimensional-arrays-in-swift
or 如何在 Swift 中声明多维布尔数组? https://stackoverflow.com/questions/28891878/how-to-declare-a-multidimensional-boolean-array-in-swift) 带有下标运算符,因此a[0,0] = 1
works.
这是这些解决方案的混合物,但作为
通用的struct
代替class
。我也改变了顺序
行和列参数,因为我发现这更自然:
struct Array2D<T : IntegerLiteralConvertible > {
let rows : Int
let cols : Int
var matrix: [T]
init(rows : Int, cols : Int) {
self.rows = rows
self.cols = cols
matrix = Array(count : rows * cols, repeatedValue : 0)
}
subscript(row : Int, col : Int) -> T {
get { return matrix[cols * row + col] }
set { matrix[cols*row+col] = newValue }
}
}
我不知道如何从像这样的文字创建这样的东西[2, 3 ;; -1, 0]
。但您可以从嵌套数组初始化它:
extension Array2D {
init(_ elements: [[T]]) {
let rows = elements.count
let cols = elements[0].count
self.init(rows: rows, cols: cols)
for i in 0 ..< rows {
assert(elements[i].count == cols, "Array must have same number of elements for each row")
self.matrix.replaceRange(cols * i ..< cols * (i+1), with: elements[i])
}
}
}
Example:
let array = Array2D([[1, 2, 3], [4, 5, 6]])
println(array.rows) // 2
println(array.cols) // 3
println(array[1, 2]) // 6
println(array[1, 0]) // 4
您还可以另外实施ArrayLiteralConvertible
从嵌套数组文字初始化二维数组的协议:
extension Array2D : ArrayLiteralConvertible {
init(arrayLiteral elements: [T]...) {
self.init(elements)
}
}
Example:
let array : Array2D = [[1, 2, 3], [4, 5, 6]]
对于方阵(rows == columns
)您也可以从普通数组初始化它:
extension Array2D {
init(_ elements: [T]) {
let rows = Int(sqrt(Double(elements.count)))
assert(rows * rows == elements.count, "Number of array elements must be a square")
self.init(rows: rows, cols: rows)
self.matrix = elements
}
}
Example:
let squareArray = Array2D([2, 3, -1, 0])
println(squareArray.rows) // 2
println(squareArray.cols) // 3
println(squareArray[1, 0]) // -1