2014-12-09 2 views
3

Так что я хотел вставить объекты массива в другой массив. Swift массивы, кажется, отсутствует эквивалентный метод для - (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes, но все хорошо, потому что мы можем использовать следующий синтаксис:Вставка массива в массив

var array = [0,4,5] 
array[1..<1] = [1,2,3] // array = [0,1,2,3,4,5] 

Все это хорошо? Не совсем! Ниже дает ошибку во время компиляции («[Int] не конвертируется в Int»):

var array = [0,4,5] 
var array2 = [1,2,3] 
array[1..<1] = array2 

Есть ли вменяемое объяснение этому?

Edit:

Хорошо, следующие работы (спасибо Greg):

array[1..<1] = array2[0..<array2.count] 

Как это:

let slice = array2[0..<array2.count] 
array[1..<1] = slice 

Но сейчас я совершенно запутался, как это работает , Объяснение Gregs, которое я пытался вставить в array2 в array, имеет смысл, но я не вижу разницы только в использовании литерала массива, а также почему он работает с срезом (который, кажется, является недокументированной деталью реализации?).

+1

фрагмент Соответствует ArrayLiteralConvertible протоколу, поэтому 'массив [1 .. <1] = [1,2,3]' работы. Но нет автоматического преобразования из массива в Slice или наоборот. –

ответ

4

Это происходит потому, что вы хотите вставить array2 (массив) не элементы из массива, попробовать это:

array[1..<1] = array2[0..<array2.count] 
3

подписку Range на Array<T> работает только с Slice<T>.

subscript (subRange: Range<Int>) -> Slice<T> 

В вашем случае, array2 не Slice<Int>. Вот почему вы видите ошибку.

Обычно вы должны использовать replaceRange() или splice(), который работает с произвольным CollectionType.

array.replaceRange(1..<1, with: array2) 
// OR 
array.splice(array2, atIndex: 1) 

Кроме того, назначение в диапазоне от Array имеет некоторые ошибки, я думаю. например:

var array = [0,1,2,3,4,5] 
array[1...5] = array[1...1] 

Массив должен быть результат [0, 1], но это на самом деле остается [0,1,2,3,4,5]. Это происходит только в том случае, если startIndex диапазона одинаковый, а срез построен из того же массива.

С другой стороны, replaceRange() работает как expeceted:

var array = [0,1,2,3,4,5] 
array.replaceRange(1...5, with: array[1...1]) 
// -> [0,1] 
+0

Спасибо за объяснение и за то, что вы указали мне правильный метод. – mkeiser

Смежные вопросы