为何sort(by:)在MutableCollection扩展中不可用?如何解决?
问题原因与解决办法
这问题我之前踩过坑!核心原因是命名冲突导致的编译器方法查找优先级问题:
当你在MutableCollection的扩展中定义了一个无参的sort()方法后,在该扩展的上下文里,编译器会优先查找当前扩展中定义的方法。你调用self.sort(by:)时,编译器首先匹配到你自定义的sort()(无参),发现你传了参数,就会抛出「Argument passed to call that takes no arguments」的错误——它完全没去查找系统定义的sort(by:)方法。
而改成针对Array扩展能正常运行,是因为Array的扩展里没有你自定义的sort(),编译器会直接找到系统的sort(by:)方法。
可行的解决办法
1. 明确指定调用系统的MutableCollection方法
通过类型转换,强制编译器去查找系统定义的sort(by:):
struct MyType { var priority:Int } extension MutableCollection where Element == MyType { mutating func sort() { // 转换为MutableCollection类型,让编译器找到系统方法 (self as MutableCollection).sort(by: { $0.priority > $1.priority }) } }
2. 给自定义方法重命名(推荐)
最直观的方式是避免命名冲突,给你的排序方法起一个更具语义的名字,比如sortByPriority():
struct MyType { var priority:Int } extension MutableCollection where Element == MyType { mutating func sortByPriority() { self.sort(by: { $0.priority > $1.priority }) } }
这种方式代码可读性更高,也不会和系统方法产生歧义。
3. 使用全限定名调用(可选)
如果你坚持要用sort作为方法名,也可以通过MutableCollection.sort(by:)的方式调用,不过写法稍显繁琐:
struct MyType { var priority:Int } extension MutableCollection where Element == MyType { mutating func sort() { MutableCollection.sort(self, by: { $0.priority > $1.priority }) } }
内容的提问来源于stack exchange,提问作者Haravikk
相关产品推荐
相关产品推荐

