如何在两个未知类型的对象上使用Equatable协议?

时间:2016-01-19 17:08:18

标签: swift

假设我有两个变量,并且我不知道它们是什么类型(并且在运行之前它们不可能知道它们是什么类型):

var a: Any
var b: Any

如何使用Equatable协议测试它们是否相等?我不能只做a == b,因为这要求两个项目都相同,Equatable类型,并且编译器无法证明这一点,因为它们可能是不同的类型(和其中一个或两个可能都不是Equatable)。

那么,是否可以告诉编译器检查它们是否具有相同的类型,如果该类型符合Equatable,那么在它们上使用==运算符并返回结果,否则返回假?

如果没有办法做到这一点,Swift是否有充分理由阻止这种情况,或者将来是否可以修复Swift的当前限制?

2 个答案:

答案 0 :(得分:1)

您使用泛型和函数重载:

func isEqual<T: Equatable>(a: T, b: T) -> Bool {
    return a == b
}

func isEqual<T, U>(a: T, b: U) -> Bool {
    return false
}

如果两个变量具有相同的类型,因为该类型符合Equatable,则编译器将选择第一个函数,否则将选择第二个函数。

这也适用于Objective-C对象,允许您在调用函数之前强制转换为NSObjectisEqual(var1 as? NSObject, var2 as? NSObject)

答案 1 :(得分:1)

假设如果ab在类型上不同,那么它们永远不会相等,您可以使用带约束的通用函数来实现目标。

func isEqual<T : Equatable>(a: T, b: T) -> Bool {
    return a == b;
}

ab类型不同,因为Equatable协议假定比较的LHS和RHS属于同一类型。这似乎是一个合理的约束,但人们当然可以写出一个不需要这个的平等概念。在这些情况下,您将需要自己的平等协议。