【问题标题】:Swift buttons hidden fatal error: Array index out of rangeSwift 按钮隐藏致命错误:数组索引超出范围
【发布时间】:2015-07-30 14:57:53
【问题描述】:
@IBAction func endTurn(sender: UIButton) {
let index: Int = Int (arc4random_uniform(UInt32(coins.count)))
var i = Int(arc4random_uniform((3)))
for i; i < 3; i++ {
coins[i].hidden = true
coins.removeAtIndex(i)
println(i)
}
}
我有 21 个硬币。它是按钮数组(@IBOutlet var coin:[UIButton]!)。当我按下“endTurn”时,硬币被隐藏了。但是当我有 3 个或更少的硬币时,我得到了致命错误(行:coins[i].hidden = true)。
我需要做什么?
谢谢...
【问题讨论】:
标签:
ios
arrays
swift
hidden
fatal-error
【解决方案1】:
在遍历数组时从数组中删除是一个很大的禁忌,并且可能不会按照您的意愿去做。
var i = 0
var arr = ["1", "2", "3", "4", "5"]
for i; i < 3; i++ {
arr.removeAtIndex(i)
}
print(arr)
打印 ["2", "4"]
因为如果你看代码,你在索引 0 处删除,所以你的数组现在是 [“2”,“3”,“4”],然后你递增 i,并在索引 1 处删除。由于数组移位,索引1 是“3”,而您正在跳过“2”。
将此信息与其他答案结合使用
【解决方案2】:
您正在尝试访问超出范围的数组索引。因此,添加检查 i 是否在数组范围内应该可以防止崩溃。
if(i < coins.length) {
coins[i].hidden = true
coins.removeAtIndex(i)
}
具有 3 个元素 [0, 1, 2] 的数组从索引 0-2 开始(数组的第一个索引是 0)。
【解决方案3】:
这个循环:
for i; i < 3; i++ {
coins[i].hidden = true
coins.removeAtIndex(i) // <-- here
println(i)
}
在每次迭代中,您都会删除一枚硬币。因此,当arc4random_uniform 返回 0 时,您最多可以删除 3 个硬币。当您剩下 3 个(或更少)硬币时,您必然会遇到索引超出范围的问题。
【解决方案4】:
这是Array Concurrent Modification。而且很危险。
在迭代数组时,不应修改数组的length。您最终可能会遇到这样一种情况,即您正在访问不再存在的索引处的元素。
让 Swift 用removeRange 方法为你解决问题。下面的 sn-p 应该向您展示如何修复您的代码。
var animals = ["dog", "cat", "duck", "eagle", "cow"]
let from = 1
let to = 2
for i in from...to {
println(i) // will print `1` and `2`
}
animals.removeRange(from...to) // -> ["dog", "eagle", "cow"]
希望这会有所帮助。