Swift 3d Array创建

时间:2016-07-10 17:58:44

标签: swift multidimensional-array swift2 swift3

我想创建一个3d数组。数组将是5 * 5 *无限(最后一个或最里面的数组可能有3-5个String类型的对象)。

我试过这样的事情:

var array3D = [[[String]]]()

并尝试添加像这样的新字符串

array3D[ii][yy] += y.components(separatedBy: ";")

但是在添加新数组或字符串时遇到了问题。并得到了错误指令的错误

在学校,我每天上5堂课。因此,本周有25节课,我想制作一个代表我的时间表的iPhone应用程序。

2 个答案:

答案 0 :(得分:3)

多维数组只是一个数组数组。当你说

var array3D = [[[String]]]()

您创建的是一个空数组,它希望您添加的值为[[String]]类型。但是那些内部阵列还不存在(更不用说它们内部的内部阵列)。您无法分配到array3D[ii],因为ii超出了空数组的范围,您无法分配到array3D[ii][yy]因为array3D[ii]没有&#39} ; t存在,并且您无法追加array3D[ii][yy]中的数组,因为array3D[ii][yy]不存在。

因为数组的外层和中间层的大小是固定的( n 是5 x 5),所以您可以使用Array.init(count:repeatedValue:)轻松创建它们:

let array3D = [[[String]]](count: 5, repeatedValue:
    [[String]](count: 5, repeatedValue: []))

(这里最里面的数组是空的,因为看起来你打算总是通过追加来填充。)

但是,看起来您的用例也需要相当稀疏的数据结构。如果大多数数组都是空的,为什么要创建所有这些数组?您可以通过一种数据结构更好地服务,该数据结构允许您将元素与其存储方式进行索引的方式分离。

例如,您可以使用词典,其中每个键都是表达(日,课程,索引)组合的值。这样就不需要考虑没有任何东西的(日,课程,索引)组合。您甚至可以通过定义自己的类型并为其提供下标运算符(在appzYourLife的答案中提到),将组合编码的好抽象包装到键中。

答案 1 :(得分:0)

这个(略微修改过的)矩阵提供给The Swift Programming Language

struct Matrix<ElementType> {
    let rows: Int, columns: Int
    var grid: [[ElementType]]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(count: rows * columns, repeatedValue: [])
    }
    func indexIsValidForRow(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row: Int, column: Int) -> [ElementType] {
        get {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

用法

现在你可以写

var data = Matrix<String>(rows: 5, columns: 5)
data[0, 0] = ["Hello", "World"]
data[0, 0][0] // Hello