什么麻烦可以带来reverse()到快速数组?

Mas*_*imo 0 arrays types swift

我想知道swift数组上的reversed()方法:

var items = ["a", "b", "c"]

items = items.reversed()
Run Code Online (Sandbox Code Playgroud)

来自Apple doc的反转方法的签名表示它返回一个

ReversedRandomAccessCollection<Array<Element>>

可以将其分配回项目而不做苹果医生说的那样

例如,要获取数组的反转版本,请从reverse()方法的结果初始化一个新的Array实例.

还是会在将来出现问题?(因为编译器没有抱怨)

ken*_*ytm 7

在Swift 3中,对于一个数组有3个revers()重载:

  1. 将数组作为RandomAccessCollection处理,
    func reversed() -> ReversedRandomAccessCollection<Self>(O(1))
  2. 将数组作为BidirectionalCollection处理,
    func reversed() -> ReversedCollection<Self>(O(1))
  3. 将数组作为序列处理,
    func reversed() -> [Self.Iterator.Element](O(n))

协议符合Array

默认情况下,reversed()选择RandomAccessCollection的重载并返回ReversedRandomAccessCollection.但是,当你写作

items = items.reversed()
Run Code Online (Sandbox Code Playgroud)

你强迫RHS返回一个可转换为LHS([String])的类型.因此,只选择返回数组的第3个重载.

该重载将复制整个序列(因此O(n)),因此覆盖原始数组没有问题.


而不是items = items.reversed()创建数组的副本,反转它并将其复制回来,您可以使用变异函数达到相同的效果items.reverse(),该函数在不复制数组两次的情况下就地进行复原.