受Equatable二进制运算符约束的功能参数无法应用

时间:2018-08-19 16:47:12

标签: swift generics

我看不到我要去哪里哪里

private func check<A: Equatable, B: Equatable>(_ value: (A, B)) {
    let message = String(describing: value.0) + " does not equal " + String(describing: value.1)
    XCTAssert(value.0 == value.1, message)
}

错误:二进制运算符'=='不能应用于类型'A'和'B'的操作数

Xcode版本9.4.1(9F2000) 斯威夫特4.1

1 个答案:

答案 0 :(得分:3)

Equatable协议定义为

public protocol Equatable {
    public static func == (lhs: Self, rhs: Self) -> Bool
}

,这意味着对于符合类型A,有一个==运算符 接受两个A类型的操作数。换句话说,你可以 将A类型的值与相同类型 A的另一个值进行比较– 但不一定具有不同类型B的值(即使 即Equatable)。

您的功能

func check<A: Equatable, B: Equatable>(_ value: (A, B))

取一个元组,其中两个成员都是相等的值–但可能 类型不同,因此编译器会抱怨该表达式

value.0 == value.1

例如,IntString都符合Equatable,因此您可以致电

check((123, "abc"))

但无法比较这些值。

您可能想要的是

func check<A: Equatable>(_ value: (A, A)) { ... }

两个元组成员都是相同等于类型A