【发布时间】:2020-12-13 16:05:24
【问题描述】:
我有定义:
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
}
当我在也符合Equatable 的引用类型对象上调用compare 时,编译器如何决定调用这些函数中的哪一个?
一个完全被接受的答案是官方 swift manifesto 的链接,解释了优先级是如何完成的,特别是当泛型符合两个都有专门化的不同协议时
【问题讨论】:
-
你为什么不打电话给
compare,看看是哪一个被叫了? -
如果对象是一个类,
Equatable的优先级可能高于AnyObject,而AnyObject的优先级高于泛型。我认为您在那里的顺序正是您期望的优先级。 -
这篇博文中的更多信息:airspeedvelocity.net/2014/10/26/…... 一般的经验法则是更具体的重载优先
-
@NewDev,但不清楚
AnyObject或Equatable是否更具体,因为非对象类型也可以符合Equatable,这意味着它们的集合差异不为空(即也就是说,两者都不是另一个的子集) -
@WinstonDu,
Equatable被认为比AnyObject更具体。可能是因为与AnyObject的一致性是隐含的......重点是这是在编译时确定的,并且由于有时很难看到差异,因此最好小心,不要滥用超载