Swift 3 2d数组Int

时间:2016-10-06 14:16:06

标签: arrays swift 2d swift3

这实际上是一个非常简单的问题,但一小时后我无法解决我的问题。

我需要创建一个Int。

的二维数组
var arr = [[Int]]()
or
var arr : [[Int]] = []

试图改变价值:

arr[x][y] = 1

致命错误:索引超出范围

我应该使用APPEND还是需要指定数组的大小?

我很困惑..

2 个答案:

答案 0 :(得分:20)

真的不简单。这一行:

var arr : [[Int]] = []

创建类型为Array of Array of Int的变量,最初该数组为空。你需要像在Swift中的任何其他数组一样填充它。

让我们回到单一阵列:

var row : [Int] = []

现在你有一个空数组。你不能只做:

row[6] = 10

首先必须向数组中添加7个值,然后才能访问索引6(第7个值)的值。

使用您的数组数组,您需要使用一组内部数组填充外部数组。每个内部数组都需要用适当数量的值填充。

这是一种初始化数组数组的简单方法,假设您需要一个预填充矩阵,每个值都设置为0。

var matrix : [[Int]] = Array(repeating: Array(repeating: 0, count: 10), count: 10)

外部计数表示行数,内部计数表示列数。根据需要调整每个。

现在您可以访问矩阵中的任何单元格:

matrix[x][y] = 1 // where x and y are from 0 to rows-1/columns-1

答案 1 :(得分:1)

不仅需要在分配任何值之前初始化数组和子数组,而且每个数组长度必须大于您尝试设置的索引位置。

这是因为Swift既没有为你初始化子数组,也没有在分配索引时增加数组长度。

例如,以下代码将失败:

var a = [Int]()
a[0] = 1
// fatal error: Index out of range

相反,您可以使用要保留的元素数初始化数组,并使用默认值填充它,例如:

var a = Array(repeating: 0, count: 100)
a[0] = 1
// a == [1, 0, 0, 0...]

创建一个100×100的矩阵,初始化为0值:

var a = Array(repeating: Array(repeating: 0, count: 100), count: 100)
a[0][0] = 1

如果您不想为矩阵指定初始尺寸,可以这样做:

var a = [[Int]]()
a.append([])
a[0].append(1)