Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift中使通用枚举相等?_Swift_Generics_Swift3_Enums_Extension Methods - Fatal编程技术网

如何在Swift中使通用枚举相等?

如何在Swift中使通用枚举相等?,swift,generics,swift3,enums,extension-methods,Swift,Generics,Swift3,Enums,Extension Methods,具有通用枚举结果 枚举结果{ 成功案例(T) 案例错误 } 如何使其符合Swift版本3或更高版本中的equalable协议 我尝试了以下方法: 扩展结果:相等{ 静态函数==(左:结果,右:结果)->Bool{ 开关(左、右){ 案例let(.success(lhsVal),.success(rhsVal)): 返回lhsVal==rhsVal 大小写(.error,.error): 返回真值 违约: 返回错误 } } } 但是,这会产生编译器错误:类型“Result”不符合协议“equ

具有通用枚举
结果

枚举结果{
成功案例(T)
案例错误
}
如何使其符合Swift版本3或更高版本中的
equalable
协议


我尝试了以下方法:

扩展结果:相等{
静态函数==(左:结果,右:结果)->Bool{
开关(左、右){
案例let(.success(lhsVal),.success(rhsVal)):
返回lhsVal==rhsVal
大小写(.error,.error):
返回真值
违约:
返回错误
}
}
}
但是,这会产生编译器错误:
类型“Result”不符合协议“equalable”

我还尝试了以下方法:

扩展结果:相等{
静态函数==(左:结果,右:结果)->Bool{
开关(左、右){
案例let(.success(lhsVal),.success(rhsVal)):
返回lhsVal==rhsVal
大小写(.error,.error):
返回真值
违约:
返回错误
}
}
}

但是,这会产生一个编译器错误:
二进制运算符“==”不能应用于两个“T”操作数

将泛型类型约束为
可等式是否有帮助

enum Result<T : Equatable> {
    case success(T)
    case error
}
枚举结果{
成功案例(T)
案例错误
}

编写此扩展而不执行:

extension Result: Equatable where T: Equatable {}

T
符合
Equatable
时,
结果将自动符合
Equatable

Ah,它确实有帮助。谢谢你@vadian!不幸的是,这意味着我需要在定义
Result
enum的同一项目中为
T
编写
equalable
扩展。这是一个问题的原因,因为我只需要在我的单元测试项目中,而不是在应用程序本身中,枚举是
equalable
。你知道怎么解决吗,也就是说,在不向主代码库中添加与可均衡单元测试相关的代码的情况下?如何使
结果
不总是要求
可均衡
?@RodrigoRuiz,如果您不需要
可均衡
忽略它。当
t
是可均衡的时,我需要
结果
是可均衡的
,但不是
T
总是
equalatable
。没有
可能是equalatable
。您可以添加第二个不符合
equalable
的泛型类型。嘿,谢谢您的回答!看起来是个好建议。不幸的是,我现在手头没有Xcode来测试它,但我会尽量记住重新开始。