我正在使用antitypical/result包来提供通用的Result类型。该软件包定义Result如下:
public enum Result<T, Error> {
...
}
现在,我只希望在我的代码中返回NSError
类型的错误,所以如果我不必继续这样做会很好:
func myFunc() -> Result<String, NSError> { ... }
相反,我想创建一个派生的StdResult类型,以便我可以这样做:
func myFunc() -> StdResult<String> { ... }
我尝试了各种各样的东西,但我找不到解决方案。例如,这不起作用:
typealias StdResult<T> = Result<T, NSError>
是否有解决方案可行?
答案 0 :(得分:2)
不幸的是我们在这里非常有限。 Swift不支持泛型类型,所以我们可以将它作为一种带有struct的黑客攻击:
struct StdResult<T> {
typealias Type = Test<T, NSError>
}
func myFunc() -> StdResult<String>.Type {
}
这是否适合你所寻找的足够的东西?
答案 1 :(得分:1)
目前,没有通用的 typealias 支持和枚举继承,但您可以使用RawRepresentable
协议。它不像普通的typealias那样容易,但它可能符合你的需要。
可以转换为关联的“原始”类型的类型,然后转换回来生成与原始类型相同的实例。
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> { }
注意:原始Result
枚举的属性和方法仅 可从rawValue
属性访问,因此,例如,如果您愿意将您的新StdResult
与另一个进行比较,必须使用rawValue
属性或自行重新实施这些协议。
答案 2 :(得分:0)
您可以为特定的结果类型设置别名,这样您就不必经常tail
e.g。
func myThing() -> Result<String, NSError>
我很难想出像
这样的通用解决方案typealias StringResult = Result<String, NSError>
func myOtherThing() -> StringResult
没有准确理解MyResult<String>
正在做什么。如果你张贴一些内部人物,我可以再拿一次破解。