【问题标题】:Swift 3 2d array of IntSwift 3 2d Int 数组
【发布时间】:2016-10-06 14:16:06
【问题描述】:

这其实是一个很简单的问题,但是一个小时后我还是不能解决我的问题。

我需要创建一个 Int 的二维数组。

var arr = [[Int]]()
or
var arr : [[Int]] = []

试图改变价值:

arr[x][y] = 1

致命错误:索引超出范围

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

我很困惑..

【问题讨论】:

  • 重要的是,您应该将其提取为 Matrix2D<T> 类型(或类似的东西),以强制执行不变量。例如,没有什么能阻止某人说出arr[x].removeAll() 并破坏您的阵列。您可以添加一个带有 2 个索引的下标,因此您可以得到如下语法:matrix[x, y],这真的很棒。

标签: arrays swift 2d swift3


【解决方案1】:

真的不简单。行:

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

【讨论】:

  • 非常感谢,它适用于任何数组类型吗?如..UIView等数组
  • 它应该因为Array 可以容纳任何类型。只需更改声明和传递给内部repeating 参数的值。您甚至可以将这些值设为可选,并传入 nil 作为重复值。
【解决方案2】:

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

这是因为 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 x 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多