【问题标题】:Why does this for loop that iterates an array throw an exception?为什么这个迭代数组的for循环会抛出异常?
【发布时间】:2015-03-31 09:15:20
【问题描述】:

我不断地从这个看似明显的 for 循环返回一个错误。

for var i = 0; i < self.restaurantNames.count; i++ {
    self.names += [Name(name: self.restaurantNames[i], city: self.addressCity[i])]
}

错误

fatal error: Array index out of range

【问题讨论】:

  • self.addressCity 的元素少于self.restaurantNames
  • 谢谢,您介意解释一下原因吗?它们都在循环内的同一行上被调用?
  • 我不知道为什么。我刚刚观察到,此代码引发越界错误的唯一可能情况是addressCity 数组包含的元素少于restaurantNames。我看不出它们被引用的那条线可能是如何相关的。它们在同一个循环中使用,是的。但这是否意味着他们必须拥有相同数量的元素?没有。

标签: arrays exception swift for-loop


【解决方案1】:

检查self.addressCity array 的大小。数组的大小可能小于self.restaurantNames array。一旦 i 变量将越过 addressCity 数组的限制。它会抛出这个异常

【讨论】:

  • 好吧——不管他们是否在同一行中调用。您必须首先检查包含 $0.objectForKey("City") 的元素列表。打印数组和包含数组的项目的长度
  • 谢谢,我查过了,它们的大小一样。循环似乎被多次调用可能是一个问题。
  • 使用循环嵌套.. for (var i = 0; i
  • 谢谢我用这个工作版本试了一下:for (var i = 0; i &lt; self.restaurantNames.count; i++) { if(i&lt;=self.addressCity.count) { self.names += [Name(name: self.restaurantNames[i], city:self.addressCity[i])] } else { self.names += [Name(name: self.restaurantNames[i], city: "")] } } 仍然是同样的错误。我认为这是因为循环不止一次运行。如何在调用循环之前清除结构?
  • 不建议重置结构。如果,你还想试试这个:social.msdn.microsoft.com/Forums/vstudio/en-US/…。不过,您可以在循环中使用其他变量来检查循环调用了多少次。
【解决方案2】:

如果您的索引范围是 010 你有11 元素。您的循环将尝试访问超出范围的11 索引。因此,如果您没有访问索引0 处的第一个元素,请尝试从i 中减去1。否则,只需从您的 array.count 中减去 1

哪一个有效取决于在您访问数组之前是否增加了i

所以对于索引为010 的数组,
您正在尝试访问 111
或尝试访问011

减去1 修复了111 的问题 (这是我怀疑正在发生的事情)。
array.count 中减去1 可以解决011 的问题

还有一个更简单的方法是使用 for-in-loop

没有时间发布,我下班后会回来查看代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多