快速调用类型受限的泛型函数的优先级?

问题描述

我有以下定义:

    func compare<T>(lhs: T,rhs: T) -> Bool where T: Equatable {
        return lhs == rhs
    }
    
    func compare<T>(lhs: T,rhs: T) -> Bool where T: AnyObject {
        return lhs === rhs
    }
    
    func compare<T>(lhs: T,rhs: T) -> Bool {
        return false
    }

当我在也符合compare的引用类型对象上调用Equatable时,编译器如何确定要调用其中哪些函数

完整接受的答案将链接到官方快速宣言,解释优先级的实现方式,尤其是当泛型符合两个都有专门知识的不同协议时

解决方法

无论出于何种原因,它对于编译器而言都不是模棱两可的(我认为这是一个错误;请参见下面的错误信息),但对我们而言却是如此。因此,写一个重载来阐明行为!

func compare<T: AnyObject>(lhs: T,rhs: T) -> Bool {
  lhs === rhs
}

func compare<T: AnyObject & Equatable>(lhs: T,rhs: T) -> Bool {
  compare(lhs: lhs as AnyObject,rhs: rhs)
}

func compare<T: Equatable>(lhs: T,rhs: T) -> Bool {
  lhs == rhs
}

func compare<T>(lhs: T,rhs: T) -> Bool {
  false
}
protocol ModuleName_A { }
protocol ModuleName_B { }

func ƒ<A: ModuleName_A>(_: A) { }
func ƒ<B: ModuleName_B>(_: B) { }

struct S: ModuleName_A & ModuleName_B { }

ƒ(S()) // Ambiguous use of 'ƒ'