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]