Swift中泛型元组比较:如何修复断言方法的编译错误
Swift元组与泛型:修复TupleAssertion的相等性判断问题
问题场景
尝试实现一个用于断言元组相等的TupleAssertion结构体,代码如下:
struct TupleAssertion<T> { let value: T func assertValue<each Value: Equatable>( _ expectedValue: (repeat each Value) ) where (repeat each Value) == T { if value == expectedValue { print("Equal") } else { print("Not equaL") } } } let tupleAssertion = TupleAssertion(value: (1, 2)) tupleAssertion.assertValue((1, 2))
运行时出现编译错误:
binary operator '==' cannot be applied to two '(repeat each Value)' operands
但以下代码却能正常执行元组相等判断:
func createTuple<each Value: Equatable>(val: repeat each Value) -> (repeat each Value) { return (repeat each val) } createTuple(val: 1, 2) == (1, 2) createTuple(val: 1, 3) == (1, 2)
解决方案
方案1:给结构体泛型参数添加Equatable约束
修改TupleAssertion的泛型定义,直接约束T遵循Equatable:
struct TupleAssertion<T: Equatable> { let value: T func assertValue<each Value: Equatable>( _ expectedValue: (repeat each Value) ) where (repeat each Value) == T { if value == expectedValue { print("Equal") } else { print("Not Equal") } } } let tupleAssertion = TupleAssertion(value: (1, 2)) tupleAssertion.assertValue((1, 2)) // 输出Equal
方案2:在断言函数中添加T的Equatable约束
如果不想限制整个结构体的T必须是Equatable,可以在assertValue函数的where子句中补充T: Equatable约束:
struct TupleAssertion<T> { let value: T func assertValue<each Value: Equatable>( _ expectedValue: (repeat each Value) ) where (repeat each Value) == T, T: Equatable { if value == expectedValue { print("Equal") } else { print("Not Equal") } } } let tupleAssertion = TupleAssertion(value: (1, 2)) tupleAssertion.assertValue((1, 2)) // 输出Equal
原因说明
原代码报错的核心是:虽然each Value被约束为Equatable,但编译器无法自动推断出T(即元组类型)本身遵循Equatable。尽管Swift会为所有元素都是Equatable的元组自动合成Equatable实现,但必须在泛型约束中明确声明T: Equatable,才能让value == expectedValue的调用通过编译。
而createTuple函数能正常工作,是因为它的返回值直接是(repeat each Value)类型,编译器可以通过each Value: Equatable直接推断出该元组类型符合Equatable,因此可以直接使用==比较。
内容的提问来源于stack exchange,提问作者Samps
相关产品推荐
相关产品推荐

