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

时间:2017-03-09 06:57:00

标签: arrays swift types

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

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

items = items.reversed()

来自Apple doc的反向方法的签名表示它返回

ReversedRandomAccessCollection<Array<Element>>

可以将其分配回项目,而无需执行苹果医生所说的

  

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

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

1 个答案:

答案 0 :(得分:7)

Swift 3中的数组有3次reverse()重载:

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

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

    items = items.reversed()
    

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

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

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