声明包含具有泛型类型的案例的枚举的返回值?

时间:2018-01-23 18:48:43

标签: swift enums

我有一个简单的网络结果枚举。如果调用成功,我将使用所请求类型的对象返回成功。如果不成功,我将返回失败消息。

enum Result<T> {
    case success(T)
    case failure(String)
}

func testAPI(requestedObjClass: String) -> Result {...}

使用此代码,编译器会给出错误:

Reference to generic type 'Result' requires arguments in <...>

它希望我用类似Result<MyObj>的东西来定义'成功'案例的类型,但根据参数它可能是不同的类型,我甚至可能根本不会返回成功。这个'结果'想法的正确架构是什么?

2 个答案:

答案 0 :(得分:2)

编译器需要在编译时解析泛型类型占位符值。例如,在

if case .success(let res) = testAPI(requestedObjClass: "...") {
    print(res)
}

编译器需要知道res的类型。所以你做不到 返回Result,其中仅在运行时确定相应的T

可能的解决方案可能是将请求的结果类型作为传递 一个类型而不是一个字符串,并使该函数通用:

func testAPI<T>(requestedObjClass: T.Type) -> Result<T> {
    // ...
}

然后在像

这样的电话中
if case .success(let res) = testAPI(requestedObjClass: Int.self) {
    print(res)
}

编译器可以推断出类型T(从而推断出结果的类型) 值res)在编译时,在此示例中为Int

答案 1 :(得分:1)

  

它希望我用某种东西来定义“成功”案例的类型   比如Result,但它可能是不同的类型,具体取决于   参数

您可以编写一些协议,如MyProtocol,然后使用此协议扩展MyObj和所有其他所需的类,例如。

class MyObj { }

protocol MyProtocol { }

extension MyObj: MyProtocol { }

extension Int: MyProtocol { }

enum Result<T> {
    case success(T)
    case failure(String)
}

func testAPI(requestedObjClass: String) -> Result<MyProtocol> {
    return .failure("Not implemented")
}

一般来说,为MyProtocol方法或计算变量形成一些约束是个好主意。拥有太动态的东西并不是非常的Swiftic方式。