致命错误:索引超出范围......为什么不编译此代码?

时间:2016-07-03 22:43:20

标签: swift multidimensional-array fatal-error conways-game-of-life

我是swift的新手并尝试设置一个10x10的Bools二维阵列,其中三分之一是真的,其余的都是假的。由于某些原因,这不会运行,而是给我一个冗长的错误,原因是:EXC_BAD_INSTRUCTION。有人可以帮我弄清楚我做错了什么。谢谢!

var before = [[Bool]]()

for x in 0..<10 {
for y in 0..<10 {
    if arc4random_uniform(3) == 1 {
        before[x][y] = true
    }
    else {
        before[x][y] = false
    }
}
}

2 个答案:

答案 0 :(得分:2)

你得到致命错误:索引超出范围,因为你无法在Swift中索引到一个空数组(因为即使数组索引0也不存在尚未)。

一种解决方案是使用嵌套数组初始值设定项初始化二维数组。如果您将其初始化为所有false,那么您只需设置true值:

var before = [[Bool]](count: 10, repeatedValue: [Bool](count: 10, repeatedValue: false))

for x in 0..<10 {
    for y in 0..<10 {
        if arc4random_uniform(3) == 1 {
            before[x][y] = true
        }
    }
}

答案 1 :(得分:1)

看起来您正在将'before'对象初始化为数组,但随后将其指定为字典。 (以及你如何分配它看起来像是可以做一个调整。

[Bool] = Bools数组 [[Bool]] = Bool数组的数组

要分配到上面你需要用你的结果创建一个[Bool]数组,并将它附加到上面的对象。

由于您似乎想将之前用作词典,因此您只需将初始化程序更改为:

var before = [Int:[Int:Bool]]()

并将您的功能更改为:

for x in 0..<10 {
    for y in 0..<10 {
        let test = x
        if arc4random_uniform(3) == 1 {
            before[x] = [y:true]
        }
        else {
            before[x] = [y:false]
        }
    }
}

然后您将成功使用

调用值
//To call before[1][3]
if let before = before[1] {
   print(before[3])
}

如果我错了并且您希望它作为Bool数组的数组工作,那么您需要更改将结果添加到'before'数组的方式:

  1. 首先生成“X值”Bools数组
  2. 将此Bool数组附加到'之前'数组
  3.   

    var before = [[Bool]]()

    for x in 0..<10 {
        var yArray = [Bool]()
        for y in 0..<10 {
            if arc4random_uniform(3) == 1 {
               yArray.append(true) // Array of Bools
            }
            else {
                yArray.append(false)
            }
        }
        before.append(yArray)
    
    }
    //To call before[1][3]
    print(before[1][3])