在Swift中将一个新元素插入一个数组中

时间:2015-12-08 08:54:41

标签: swift swift2

代码:

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”中插入新元素

1 个答案:

答案 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

所以0insert()的无效索引,这就是

的原因
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]