【问题标题】:What trouble could bring assining reversed() to a swift array?什么麻烦会给一个 swift 数组带来 assining reversed() ?
【发布时间】:2017-07-30 01:04:31
【问题描述】:

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

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

items = items.reversed()

Apple 文档中的 reversed 方法的签名说它返回一个

ReversedRandomAccessCollection<Array<Element>>

是否可以在不按照苹果文档所说的情况下将其分配回项目

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

还是会在未来出现问题? (因为编译器不会抱怨)

【问题讨论】:

  • 您应该遵循文档。因为在未来的版本中,他们可能会改变一些可能会影响this
  • 它主要是对执行时间和内存的优化,因为它不需要创建辅助数组并替换每个元素
  • 我 100% 确定您不会遇到错误。

标签: arrays swift types


【解决方案1】:

在 Swift 3 中有 3 个 reversed() 重载:

  1. 将数组视为 RandomAccessCollection,
    func reversed() -> ReversedRandomAccessCollection<Self> (O(1))
  2. 将数组视为双向集合,
    func reversed() -> ReversedCollection<Self> (O(1))
  3. 将数组视为序列,
    func reversed() -> [Self.Iterator.Element] (O(n))

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

items = items.reversed()

您正在强制 RHS 返回可转换为 LHS 的类型 ([String])。因此,只会选择返回数组的第三个重载。

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


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

【讨论】:

  • 很好的解释。请允许我通过提及reversed() 返回将保留的数组的新分离副本,让您的最后一条注释让观众更清楚他们不熟悉“变异”,但reserve() 将影响(保留)数组本身,不返回新副本。
  • @AhmadF。谢谢。在答案中插入了一些解释。
  • 那就更好了!感谢您的时间和考虑:)
  • @ahmad s/reserve/reverse/g
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多