所以我想将数组的对象插入另一个数组中。 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解释是有道理的,但我没有看到只使用数组文字的差异,以及为什么它适用于切片(这似乎是是一个没有文档的实现细节?)。
答案 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]