[英]How to specialize a generic enum in Swift
我正在使用典型/结果包来提供通用的Result类型。 该程序包定义结果如下:
public enum Result<T, Error> {
...
}
现在,我只希望在我的代码中返回类型为NSError
错误,所以如果我不必继续这样做,那就太好了:
func myFunc() -> Result<String, NSError> { ... }
相反,我想创建一个派生的StdResult类型,以便可以代替这样做:
func myFunc() -> StdResult<String> { ... }
我已经尝试过各种方法,但是找不到解决方案。 例如,这不起作用:
typealias StdResult<T> = Result<T, NSError>
有没有可行的解决方案?
不幸的是,我们在这里非常有限。 Swift不支持通用的typealias,因此我们可以通过struct来实现:
struct StdResult<T> {
typealias Type = Test<T, NSError>
}
func myFunc() -> StdResult<String>.Type {
}
这是否足以满足您的需求?
目前,没有通用的类型别名支持或枚举继承,但是您可以使用RawRepresentable
协议。 这并不像存在通用类型别名那样容易,但是它可能满足您的需求。
从苹果的文档 :
可以转换为关联的“原始”类型,然后再转换回以生成与原始等效的实例的类型。
public protocol RawRepresentable {
typealias RawValue
public init?(rawValue: Self.RawValue)
public var rawValue: Self.RawValue { get }
}
也就是说,您的原始值必须为Result<T, NSError>
:
enum StdResult<T>: RawRepresentable {
var rawValue: Result<T, NSError> {
switch self {
case .Success(let value):
return Result.Success(value)
case .Failure(let error):
return Result.Failure(error)
}
}
init?(rawValue: Result<T, NSError>) {
switch rawValue {
case .Success(let value):
self = .Success(value)
case .Failure(let error):
self = .Failure(error)
}
}
case Success(T)
case Failure(NSError)
}
func myFunc() -> StdResult<String> { }
注意 : 只能从rawValue
属性访问原始Result
枚举的属性和方法,因此,例如,如果要将新的StdResult
与另一个进行比较,则必须使用rawValue
属性或自己重新实现这些协议。
您可以为特定的Result类型添加别名,这样就不必经常执行func myThing() -> Result<String, NSError>
例如
typealias StringResult = Result<String, NSError>
func myOtherThing() -> StringResult
对我来说,想出一个通用的解决方案比较困难
MyResult<String>
不了解Result
到底在做什么。 如果您发布一些内部信息,我可能会再三破解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.