【问题标题】:I can have a generic enum with variable quantity of parameters? [duplicate]我可以有一个具有可变参数数量的通用枚举吗? [复制]
【发布时间】: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&lt;(String, Int)&gt;,例如。而且,如果请求什么都不返回,RequestResult&lt;()&gt;。但是,也许存在更好的解决方案。
  • 您可以使用RequestResult&lt;(String, Int)&gt;。您可以使用case .success(let result as (String, int))switch 语句中匹配它,但最好为每种结果类型定义一个结构,以便让事情变得清晰
  • 我只能写case .success(myString, myInt)。在这种情况下,Swift 不需要类型转换。例如:pastebin.com/5h9Ju2KW
  • 编译器不会抱怨,但你会在运行时得到一个令人讨厌的惊喜。 myString 可以是 IntmyInt 可以是 String。如果没有as,这种情况将匹配任何 2 元组。你不知道这些元组的元素是什么类型

标签: swift generics enums


【解决方案1】:

对于没有结果的请求,您可以只使用 Void 类型:

let request: RequestResult<Void> = .success()

对于具有多个结果的请求,我不太了解您的问题,因为在您提供的示例中,您已经将多个结果建模为一个数组:

RequestResult<[Post]>

如果你想要的是多个结果,每个都有不同的类型,你应该把它们放在一个结构/类中,然后将该类型作为泛型传递给你的 ResquestResult 枚举。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多