【发布时间】:2018-10-23 02:46:35
【问题描述】:
谁能解释为什么这不起作用?我收到一个错误Binary operator '==' cannot be applied to operands of type 'Self' and 'CustomEquatable'
protocol CustomEquatable {
func isEqualTo(_ other: CustomEquatable) -> Bool
}
extension CustomEquatable where Self: Equatable {
func isEqualTo(_ other: CustomEquatable) -> Bool {
return self == other
}
}
【问题讨论】:
-
问题在于,仅仅因为
self是等价的,而other是CustomEquatable(这意味着它也是Equatable),这并不意味着self与other的类型相同。例如,如果Int和String都扩展为符合CustomEquatable,那么1.isEqualTo("a")将调用1 == "a",它不会进行类型检查,因为==要求LHS 和RHS 具有相同的类型. -
为了提供一个解决方案,我们需要知道你想用这个
CustomEquatable协议实现什么。这是您尝试解决可怕的“协议 'Equatable' 只能用作通用约束,因为它具有自身或相关类型要求”错误的尝试吗? -
@Alexander 是的,是的,我是。
-
这是
AnyEquatable类型橡皮擦的正确实现:stackoverflow.com/a/46288607/3141234 -
@Alexander: "other is a CustomEquatable (这意味着它也是 Equatable)" – 除非我弄错了,
other可以是一个不同的 类型采用CustomEquatable,不必是Equatable。
标签: swift generics swift-protocols