我使用通用类型为Result<T: Resource, Error>
的Result Enum表示了我的API请求的结果
在某些情况下,我不想讨论请求是成功还是失败,但是我仍然需要返回的资源作为可为空的值。
我尝试将扩展名编写为以下代码:
extension Result<T, Error> where T: Resource {
var value: Any? {
switch self {
case .success(let resource):
return resource.value
case .failure:
return null
}
}
}
但是我遇到了这些编译器错误:
必须在具有“ where”子句指定约束的非专业通用类型“ Result”上声明受约束的扩展名
使用未声明的类型'T'
答案 0 :(得分:1)
您只需按如下所示创建扩展名,
extension Result {
var value: Any? {
switch self {
case .success(let resource):
return resource
case .failure:
return nil
}
}
}
与enum
定义一样,T
始终为Resource
,因此您无需在扩展名中指定。
但是,如果Resource
是某个protocol
,并且您想在声明中对value
变量施加约束,则可以在扩展名中使用where
子句指定该变量,如下所示,
extension Result where T == someSubTypeOfResource {
var value: Any? {
switch self {
case .success(let resource):
return resource
case .failure:
return nil
}
}
}
答案 1 :(得分:1)
编写类型约束如下:
enum Result<T, Error> {
case success(T)
case failure(Error)
}
struct Resource {
let value: String
}
extension Result where T == Resource {
var value: Any? {
switch self {
case .success(let resource):
return resource.value
case .failure:
return nil
}
}
}
答案 2 :(得分:1)
您可以像这样做
enum Result<T> where T: Resource {
case success(T)
case failure(Error?)
}
使用enum Result
创建case success
的{{1}},接受类型为Resource
的通用关联值,并使用case failure
作为其另一个Error?
关联值。
由于您使用的是Resource
类型的通用参数,因此我假设Resource
是具有protocol
作为其属性之一的value
。
protocol Resource {
var value: String {get set}
}
现在,extension Result
就像
extension Result {
var value: Any? {
switch self {
case let .success(resource):
return resource.value
case let .failure(error):
return error
}
}
}
现在return error
中的case failure
和resource.value
中的case success
。
您无需在T
中的where
子句中指定通用参数 extension
,因为您在定义{{1 }}。
用法:
enum Result