什么是斯威夫特多维数组的语法? [英] What is the syntax for multidimensional array in Swift?

查看:148
本文介绍了什么是斯威夫特多维数组的语法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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]?

推荐答案

是的,没有什么内建(据我所知)。你可以自定义一个类/结构(如<一个href=\"http://stackoverflow.com/questions/27139437/most-efficient-way-to-access-multi-dimensional-arrays-in-swift\">Most有效地访问多维数组的斯威夫特?
或<一个href=\"http://stackoverflow.com/questions/28891878/how-to-declare-a-multidimensional-boolean-array-in-swift\">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 a generic struct instead of class. I have also changed the order of the 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

这篇关于什么是斯威夫特多维数组的语法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆