将变异数组转换为非变异数组
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
以接受集合而不是数组。
我有这样的代码:
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
以接受集合而不是数组。