我想创建一个3d数组。数组将是5 * 5 *无限(最后一个或最里面的数组可能有3-5个String类型的对象)。
我试过这样的事情:
var array3D = [[[String]]]()
并尝试添加像这样的新字符串
array3D[ii][yy] += y.components(separatedBy: ";")
但是在添加新数组或字符串时遇到了问题。并得到了错误指令的错误
在学校,我每天上5堂课。因此,本周有25节课,我想制作一个代表我的时间表的iPhone应用程序。
答案 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