【发布时间】:2017-10-28 00:42:15
【问题描述】:
我正在写一个网络层,并且,我写了一个枚举来封装一个请求的结果:
enum RequestResult<T> {
case success(T)
case error(RequestError)
}
对于每个请求,我只能选择成功或失败。然后,我可以这样使用:
class PostsRequest {
...
static func fetch(completion: @escaping (RequestResult<[Post]>) -> Void) {
但是,我如何在没有成功结果或成功结果很多的请求中使用我的通用 RequestResult?我可以在一个案例中编写一个可变数量的通用枚举吗?
【问题讨论】:
-
可以将成功案例改为
case success([T]),假设所有结果都是T类型 -
@CodeDifferent 好吧...我正在考虑使用元组/结构。然后,如果一个请求返回两个参数,我可以使用
RequestResult<(String, Int)>,例如。而且,如果请求什么都不返回,RequestResult<()>。但是,也许存在更好的解决方案。 -
您可以使用
RequestResult<(String, Int)>。您可以使用case .success(let result as (String, int))在switch语句中匹配它,但最好为每种结果类型定义一个结构,以便让事情变得清晰 -
我只能写
case .success(myString, myInt)。在这种情况下,Swift 不需要类型转换。例如:pastebin.com/5h9Ju2KW -
编译器不会抱怨,但你会在运行时得到一个令人讨厌的惊喜。
myString可以是Int,myInt可以是String。如果没有as,这种情况将匹配任何 2 元组。你不知道这些元组的元素是什么类型