2016-05-03 3 views
-1

Я пытаюсь добавить URL в каждую пятую строку массива, но по какой-то странной причине это не работает.Вставить объект в nmutable массив по индексу динамически не работает

Этот работает, и я хочу сделать это динамически.

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)'

ответ

2

Как @patrick и @chronikum говорят, указательным или i прогонов "через край"

Ваша проблема заключается здесь:

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

Если у вас есть 24 элементов в вашем tableData то вы фактически зацикливаете на 3 элемента, которых там нет. Это будет работать, если вы на самом деле ничего не делаете в своем цикле.

Но когда вы говорите:

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

и i больше tableData.count, то вы пытаетесь вставить что-то в tableData в положении, которое не существует (26 в этом случае, в массив, содержащий 24 элемента).

Я не знаю, если это делает то, что вы хотите, но простое исправление было бы просто запустить до конца tableData, так что вы можете изменить свой цикл для:

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

И если вы хотите, чтобы сделать это более «Swifty», то, возможно, вы могли бы посмотреть на функции enumerate, как описано в The Swift Programming Guide (поиск «Перебор массива»)

Надежда, что помогает.

+0

Это исправлено, спасибо! – Rubberduck1337106092

3

Array имеет 24 предмета, и вы пытаетесь получить номер позиции 26. Это невозможно.