Swift Array<MutableCollection> 的扩展不允许 reverse()

Swift extension of Array<MutableCollection> won't allow reverse()

我正在尝试扩展 Array<MutatingCollection> 以便我可以镜像数组数组的内容,但是编译器说我不能对数组中的元素调用 reverse(),尽管 reverse()MutatingCollection 协议中定义。

我想做这样的事情:

var table = [[0,1,2],
             [3,4,5],
             [6,7,8]]
table.mirror()
//table now [[2,1,0],
//           [5,4,3],
//           [8,7,6]]

这是我的(不工作)代码:

 extension Array where Element == MutableCollection {
        mutating func mirror() {
            for index in self.indices {
                self[index].reverse()
            }
        }
    }

我也试过 self.map {array in array.reverse()}(我 认为 做同样的事情,但我没有完全理解 map())方式导致相同的错误消息:

Member 'reverse' cannot be used on value of type 'MutableCollection'

编辑:我可以直接调用相同的代码,它按预期工作。

Playgrounds Screenshot

也许我使用 extension 不当,或者 Swift Playgrounds 以某种方式阻止了我的访问。

首先,扩展应该这样声明:

extension Array where Element : MutableCollection {

您想检查 Element 是否遵守协议 MutableCollection,而不是 MutableCollection

但是,出于某种原因,我无法在 subscript 上调用 reverse 方法。我能做的最好的是:

extension Array where Element : MutableCollection {
  mutating func mirror() {
    for index in self.indices {
      self[index] = self[index].reversed() as! Element
    }
  }
}

虽然强制转换非常丑陋,但我不喜欢这样做,但它可以根据需要工作。我想我应该测试演员阵容以确定但我看不到任何调用 reversed() 会导致集合无法回归 Element.

的情况

编辑:

我想通了这个问题。 reverse() 方法仅在 MutableCollection 也是 BidirectionalCollection 时有效。此代码现在可以正常工作:

extension MutableCollection where
  Iterator.Element : MutableCollection &
                     BidirectionalCollection,
  Indices.Iterator.Element == Index {
  mutating func mirror() {
    for index in self.indices {
      self[index].reverse()
    }
  }
}

现在代码应该适用于所有 MutableCollection,其元素都是 MutableCollectionBidirectionalCollection - 例如 [Array<Int>] 甚至 [ArraySlice<Int>]

您可以在此处查看 Swift 3.1 中 reverse() 的完整代码:

Reverse.swift

extension MutableCollection where Self : BidirectionalCollection