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
,其元素都是 MutableCollection
和 BidirectionalCollection
- 例如 [Array<Int>]
甚至 [ArraySlice<Int>]
您可以在此处查看 Swift 3.1 中 reverse()
的完整代码:
extension MutableCollection where Self : BidirectionalCollection
我正在尝试扩展 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
,其元素都是 MutableCollection
和 BidirectionalCollection
- 例如 [Array<Int>]
甚至 [ArraySlice<Int>]
您可以在此处查看 Swift 3.1 中 reverse()
的完整代码:
extension MutableCollection where Self : BidirectionalCollection