swift - 如何为结果枚举编写扩展
问题描述
我已经使用具有泛型类型的 Result Enum 来表示我的 API 请求的结果,如下所示Result<T: Resource, Error>
在某些情况下,我不想讨论请求是成功还是失败,但我仍然需要返回的资源作为可空值。
我尝试将扩展编写为以下代码:
extension Result<T, Error> where T: Resource {
var value: Any? {
switch self {
case .success(let resource):
return resource.value
case .failure:
return null
}
}
}
但是我得到了这些编译器错误:
约束扩展必须在非特化泛型类型“Result”上声明,约束由“where”子句指定
使用未声明的类型“T”
解决方案
您可以简单地创建如下扩展,
extension Result {
var value: Any? {
switch self {
case .success(let resource):
return resource
case .failure:
return nil
}
}
}
正如在enum
定义中一样,T
总是Resource
这样您就不需要在扩展名中指定。
但是如果Resource
是一些protocol
并且您想value
在声明中对变量施加约束,那么您可以在扩展 usingwhere
子句中指定它,如下所示,
extension Result where T == someSubTypeOfResource {
var value: Any? {
switch self {
case .success(let resource):
return resource
case .failure:
return nil
}
}
}
推荐阅读
- amazon-web-services - Sagemaker 分布式数据并行性未按预期工作 (smdistributed.dataparallel.torch.distributed)
- python - 如何覆盖父方法保留签名?
- cordova - 在 cordova-plugin-inappbrowser 中未启用自动完成
- java - 在spring boot中指定扫描包时是否可以排除一个类?
- azure - 在虚幻引擎 4.26 中创建天蓝色空间锚点
- linux - 使用 awk 打印按行过滤的文件的最后 N 行
- linux - Google chrome 未在 ubuntu 18.04 环境中运行
- cmake - clion wsl "需要 CMake 3.20 或更高版本。您正在运行版本 3.16.3"
- gtk - 缺少用于构建 libgtkwebkit 的 libsoup3
- c++ - 将无符号值分配给整数数据类型