我正在尝试编写一个用于分割测试的函数,当传递枚举值时,该函数将以泛型响应进行响应。
在下面的代码中,当调用getSplit(forFeature:)
函数时,SplitResponse
会根据传入的Feature
而变化。
protocol SplitResponse {
associatedtype T
func split() -> T
}
enum Feature {
case feature1 // split test = Feature1Split
case feature2 // split test = Bool
}
enum Feature1Split {
case splitA
case splitB
case splitC
}
func getSplit(forFeature: Feature) -> SplitResponse {
switch feature {
case .feature1: return Feature1Response()
case .feature2: return Feature2Response()
}
}
struct Feature1Response: SplitResponse {
typealias SplitResponse = Feature1Split
func getSplit() -> SplitResponse {
// split logic
return .splitA
}
}
struct Feature2Response: SplitResponse {
typealias SplitResponse = Bool
func getSplit() -> SplitResponse {
// split logic
return true
}
}
let split1 = getSplit(forFeature: .feature1).split()
switch split1 {
case .splitA: // doSomething
case .splitB: // doSomethingElse
case .splitC: // doAnotherThing
}
let split2 = getSplit(forFeature: .feature2).split()
if split2 == true {
// doSomething
} else {
// doSomethingElse
}
但是,我在Protocol 'SplitResponse' can only be used as a generic constraint because it has Self or associated type requirements
的getSplit(forFeature:)
上得到一个错误
Q1.我认为解决方案是根据传入的Feature
关联SplitResponse
类型。我该怎么做?
Q2.有没有办法完全摆脱Feature1Response
、Feature2Response
结构体和SplitResponse
协议?所以getSplit(forFeature:)
直接返回Feature1Split
或Bool?
4条答案
按热度按时间ujv3wf0j1#
如果你不介意可选的,你也可以尝试一个类型删除的
AnyResponse
:zzlelutf2#
不能如你所愿。您需要使用更多的枚举。
该语言没有很好的工具来使用
split
,而您可能希望这样做。查看我的答案here,了解您需要做的事情,以帮助解决这个问题,如果您需要进一步的指导,请告诉我。lmvvr0a83#
你可以使用枚举:
c9x0cxw04#
您正在尝试的操作目前在Swift中不受支持。让我们看看这一行:
它返回
SplitResponse
对象,但它只是一个纯协议对象,没有具体的associatedtype
。所以当你调用你的split
(也就是你的strut
对象中的getSplit)时,可能是一个错字?)函数,编译器没有机会检测返回类型是什么。Swift编译器不喜欢这样,这就是你遇到的错误。即使您的两个对象符合相同的协议,也没有任何有意义的方式可以一起使用它们。例如,让我们考虑这种情况:
print(split1 == split2)
表达式将是无效的,因为编译器无法真正知道split1
和split2
是什么类型。一个可以是Bool
,另一个是Feature1Split
类型,这将使表达式无效。另一方面,两者都可以是Bool
s,这将使表达式有效。但即使我们知道这是有效的,编译器也没有机会知道这一点。