代码:
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”中插入新元素
答案 0 :(得分:4)
oldNums[1..<4]
不是数组,而是ArraySlice
:
类似于Array的类型,表示任何Array,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)
创建一个真实的&#34;数组而不是切片,使用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]