将变异数组转换为非变异数组

Converting a mutating array to non-mutating in place

我有这样的代码:

let array = self.doSomething(Array<UInt8>([10, 29, 33]).reverse())

问题是 doSomething 需要一个非变异数组,而 reverse() 函数 returns 是一个变异数组。

如何将 Array<UInt8>([10, 29, 33]).reverse() 就地 转换为非变异数组 ,而无需创建另一行代码,例如

let array = self.doSomething(Array<UInt8>([10, 29, 33]).reverse().nonMutating)

没有 "mutating" 和 "non-mutating" 数组。问题是您可能正在创建一个 ReversedCollection,并且您想要一个数组。您可以通过从集合中创建一个数组来创建它:

let array = self.doSomething(Array(Array<UInt8>([10, 29, 33]).reversed()))

注意这里的方法是reversed()不是reverse()reverse() returns 无效(您可能会误认为 "mutating array")。

如果你的意思是 "I want to mutate an array in place and then pass it to something else," 那是两个动作,它需要两个语句。虽然可以解决额外的功能,但没有什么意义。 reversed()是O(1),Array.init(collection)是O(N),所以整个就是O(N),和Array.reversed一样。如果存在内存分配问题,则添加额外的行。将数组传递给变异函数是非常棘手的,并且绝对确定不会进行任何复制(Swift 不提供任何避免复制的承诺)。

通常我会在此处重写 doSomething 以接受集合而不是数组。