问题描述
的 CO球迷:你跳进结论之前,它是一个重复的,有2个不同的阵列的味道,似乎我问少流行的一种的
到目前为止,我只看到了交错数组像语法[INT]]
,但我找不到持平多维数组的任何信息。那么,什么是类型的语法(如 INTS
的二维数组),什么是初始化数组等数据的语法?是否有任何 [2,3 ;; -1,0]
?
So far, I saw only syntax for jagged arrays like [[Int]]
, but I couldn't find any info about flat multidimensional arrays. So what is the syntax for type (like 2d array of Ints
) and what is the syntax of initializing such array with data? Is there any [2, 3 ;; -1, 0]
?
推荐答案
是的,没有什么内建(据我所知)。你可以自定义一个类/结构(如Most有效地访问多维数组的斯威夫特?
或How在斯威夫特申报多维布尔数组?)与标操作符,让 A [0,0] = 1
和
Yes, there is nothing built-in (as far as I know). You can define a custom class/struct (as in Most efficient way to access multi-dimensional arrays in Swift?or How to Declare a Multidimensional Boolean array in Swift?) with a subscript operator, so that a[0,0] = 1
works.
下面是这些解决方案的混合物,但作为一个
通用结构
而不是类
。我也改变了顺序
行和列参数,因为我觉得更自然:
Here is a mixture of those solutions, but as ageneric struct
instead of class
. I have also changed the order ofthe rows and columns parameters because I find that more natural:
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]
。但是你可以从一个嵌套数组初始化:
I don't see how to create such a thing from a literal like[2, 3 ;; -1, 0]
. But you could initialize it from a nested array:
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])
}
}
}
例如:
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
协议初始化从二维数组的嵌套数组文本:
You can additionally implement the ArrayLiteralConvertible
protocol to initialize a 2d array from a nested array literal:
extension Array2D : ArrayLiteralConvertible {
init(arrayLiteral elements: [T]...) {
self.init(elements)
}
}
例如:
let array : Array2D = [[1, 2, 3], [4, 5, 6]]
有关方形阵列(行==列
),你可以从另外一个普通数组初始化:
For square arrays (rows == columns
) you could alternatively initialize it from a plain array:
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
}
}
例如:
let squareArray = Array2D([2, 3, -1, 0])
println(squareArray.rows) // 2
println(squareArray.cols) // 3
println(squareArray[1, 0]) // -1
这篇关于什么是斯威夫特多维数组的语法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!