【问题标题】:Why is sort(by:) unavailable in extensions to MutableCollection?为什么 sort(by:) 在 MutableCollection 的扩展中不可用?
【发布时间】:2018-05-29 13:38:45
【问题描述】:

我正在尝试为MutableCollection 编写一个扩展,它需要使用sort(by:) 方法进行排序,但它似乎不适用于MutableCollection 扩展,尽管此方法是为@987654325 定义的@(至少根据 Apple 开发者文档)。

这是一个非常人为和简化的示例:

struct MyType { var priority:Int }
extension MutableCollection where Element == MyType {
    mutating func sort() { self.sort(by: { $0.priority > $1.priority }) }
}

但这会导致错误Argument passed to call that takes no arguments,这是因为我自己的sort()方法此时正在被看到,似乎根本没有意识到sort(by:)

如果我将扩展名改为Array,那么扩展名就可以正常工作,但当然它是特定于类型的,而不是适用于符合MutableCollection的所有类型,这正是我真正想要的(为了尽可能通用)。

为什么此时我无法看到和使用 sort(by:) 方法,有什么方法可以解决这个问题吗?

【问题讨论】:

标签: swift protocols extension-methods


【解决方案1】:

文档有点误导。为了就地排序,集合还必须是RandomAccessCollection

struct MyType { var priority:Int }
extension MutableCollection where Self: RandomAccessCollection, Element == MyType {
    mutating func sort() { self.sort(by: { $0.priority > $1.priority }) }
}

【讨论】:

  • 啊哈!您是如何发现这一点的,是否需要深入研究源代码?似乎文档迫切需要包含对此类方法的约束,因为我确信我会在某个时候遇到类似的问题。
  • 是的;我一直在寻找源头来弄清楚事情是如何运作的。 github.com/apple/swift/blob/…
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多