我有一个简单的网络结果枚举。如果调用成功,我将使用所请求类型的对象返回成功。如果不成功,我将返回失败消息。
enum Result<T> {
case success(T)
case failure(String)
}
func testAPI(requestedObjClass: String) -> Result {...}
使用此代码,编译器会给出错误:
Reference to generic type 'Result' requires arguments in <...>
它希望我用类似Result<MyObj>
的东西来定义'成功'案例的类型,但根据参数它可能是不同的类型,我甚至可能根本不会返回成功。这个'结果'想法的正确架构是什么?
答案 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方式。