如何将一个数组块传递给inout函数?类型擦除?

时间:2016-05-24 02:32:54

标签: swift type-erasure inout

我有一个功能

func doThing(inout array: [Int]) { //thing }

我有阵列

var stuff = [0,1,2,3,4,5,6]

我希望doThing只对前三个元素进行操作。

doThing(&stuff[0..<3])

以来没有工作
var partOfStuff: ArraySlice<Int> = stuff[0..<3]

doThing不接受ArraySlice。我能想到的最好的事情是将stuff嵌入AnyCollectionType或其他类型擦除的结构中,并将doStuff的参数更改为类型擦除类型。但这似乎不值得付出努力而且非常不优雅,我认为不使用inout会更好。

有人有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

ArraySlice是写时复制的,因此当您将其用作inout时,您正在修改原始数组的副本。最好传递要修改的索引:

// Double the elements at the indicated indices
func doThing(inout array: [Int], onIndices indices: [Int]) {
    for i in indices {
        array[i] *= 2
    }
}

var stuff = [0,1,2,3,4,5,6]
doThing(&stuff, onIndices: Array(0..<3))