问题描述
我有以下定义:
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 'ƒ'