将数组插入数组

时间:2014-12-09 10:14:15

标签: arrays swift

所以我想将数组的对象插入另一个数组中。 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]

一切都好吗?不完全的!以下给出了编译时错误(&#34; [Int]不能转换为Int&#34;):

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

对此有明确的解释吗?

编辑:

好的,以下作品(感谢格雷格):

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

以及:

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

但是现在我完全混淆了这是如何运作的。我尝试将array2本身插入array的Gregs解释是有道理的,但我没有看到只使用数组文字的差异,以及为什么它适用于切片(这似乎是是一个没有文档的实现细节?)。

2 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为你要插入一个array2(Array)而不是数组中的元素, 试试这个:

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

答案 1 :(得分:3)

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()就像被驱逐一样:

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