假设我有两个变量,并且我不知道它们是什么类型(并且在运行之前它们不可能知道它们是什么类型):
var a: Any
var b: Any
如何使用Equatable
协议测试它们是否相等?我不能只做a == b
,因为这要求两个项目都相同,Equatable
类型,并且编译器无法证明这一点,因为它们可能是不同的类型(和其中一个或两个可能都不是Equatable
)。
那么,是否可以告诉编译器检查它们是否具有相同的类型,如果该类型符合Equatable
,那么在它们上使用==
运算符并返回结果,否则返回假?
如果没有办法做到这一点,Swift是否有充分理由阻止这种情况,或者将来是否可以修复Swift的当前限制?
答案 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对象,允许您在调用函数之前强制转换为NSObject
:isEqual(var1 as? NSObject, var2 as? NSObject)
答案 1 :(得分:1)
假设如果a
和b
在类型上不同,那么它们永远不会相等,您可以使用带约束的通用函数来实现目标。
func isEqual<T : Equatable>(a: T, b: T) -> Bool {
return a == b;
}
a
和b
类型不同,因为Equatable
协议假定比较的LHS和RHS属于同一类型。这似乎是一个合理的约束,但人们当然可以写出一个不需要这个的平等概念。在这些情况下,您将需要自己的平等协议。