【问题标题】: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"]
          

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-15
            • 1970-01-01
            相关资源
            最近更新 更多