2015-12-08 3 views
1

Код:вставить новый элемент в массив в Swift

let oldNums: [Int] = [1, 2, 3, 4, 5 ,6 , 7, 8, 9, 10] 
var newArray = oldNums[1..<4] 
newArray.insert(99, atIndex: 0) // <-- crash here 
newArray.insert(99, atIndex: 1) // <-- work very well 

Я благодарю newArray новый изменчивый переменной. Поэтому я смущаюсь. Почему? Я не могу вставить новый элемент в «newArray»

ответ

4

oldNums[1..<4] не является массивом, но ArraySlice:

Массив типа типа, который представляет собой подпоследовательность любого массива, ContiguousArray, или другой ArraySlice.

Показатели сегментов массива не основаны на нулевом значении, а соответствуют индексам исходного массива. Это изменение, которое пришел с Swift 2 и документирован в Xcode 7.0 Release notes:

Для согласованности и лучшего состава общего кода, ArraySlice индексов больше не всегда с нулем, но карта непосредственно на индексов коллекция, которую они нарезают, и поддерживает это отображение даже после мутаций.

В вашем случае:

let oldNums: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
var newArray = oldNums[1..<4] 
print(newArray.indices) 
// 1..<4 

Так 0 является недействительным индекс insert(), и вот почему

newArray.insert(99, atIndex: 0) 

аварии. Для того, чтобы вставить элемент в начале среза, вы можете использовать

newArray.insert(99, atIndex: newArray.startIndex) 

Чтобы создать «реальный» массив вместо среза, используйте Array() конструктор:

let oldNums: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
var newArray = Array(oldNums[1..<4]) 
print(newArray.indices) 
// 0..<3 

newArray.insert(99, atIndex:0) 
print(newArray) 
// [99, 2, 3, 4] 
Смежные вопросы