动态地将对象插入索引处的 nsmutablearray 不起作用

Insert object to nsmutable array at index dynamicly is not working

我正在尝试向数组的每第五行添加一个 URL,但由于某些奇怪的原因,这不起作用。

这个有效,我想动态地制作它。

self.tableData.insertObject(url!, atIndex: 0);
self.tableData.insertObject(url!, atIndex: 5);
self.tableData.insertObject(url!, atIndex: 10);
self.tableData.insertObject(url!, atIndex: 15);
self.tableData.insertObject(url!, atIndex: 20);
self.tableData.insertObject(url!, atIndex: 25);

数组:

var tableData:NSMutableArray = NSMutableArray()

我试过的循环在我看来应该有效。

for(var i = 0; i < (tableData.count + 3); i += 1) {
      if(i % 5 == 0){
          dispatch_async(dispatch_get_main_queue())
           {
             self.tableData.insertObject(url!, atIndex: i);
           }
       }

}

错误:

'NSRangeException', reason: '-[__NSCFArray insertObject:atIndex:]: index (26) beyond bounds (24)'

索引不在 array.count 范围内。

数组有 24 个项目,您正在尝试获取项目编号 26。这是不可能的。

正如@patrick 和@chronikum 所说,您的索引或 i 运行 "over the edge"

你的问题出在这里:

for(var i = 0; i < (tableData.count + 3); i += 1)

如果您的 tableData 中有 24 个元素,那么您实际上循环了 3 个不存在的元素。如果您实际上在循环中不做任何事情,那将起作用。

但是当你说:

self.tableData.insertObject(url!, atIndex: i);

i 大于 tableData.count,那么你试图在 tableData 中不存在的位置插入一些东西(在这种情况下,在数组中为 26包含 24 个元素)。

我不知道这是否符合您的要求,但一个简单的解决方法是 运行 tableData 的末尾,因此您可以将 for 循环更改为:

for(var i = 0; i < (tableData.count); i += 1)

如果您想更多地这样做 "Swifty" 那么也许您可以查看 The Swift Programming Guide 中描述的 enumerate 函数(搜索 "Iterating Over an Array")

希望对您有所帮助。