如何在Swift中专门化泛型枚举
我使用这个包来提供一个通用的结果类型。此包对结果的定义如下:如何在Swift中专门化泛型枚举,swift,generics,Swift,Generics,我使用这个包来提供一个通用的结果类型。此包对结果的定义如下: public enum Result<T, Error> { ... } 相反,我想创建一个派生的StdResult类型,以便可以执行以下操作: func myFunc() -> StdResult<String> { ... } func myFunc()->StdResult{…} 我试过各种方法,但都找不到解决办法。例如,这不起作用: typealias StdResult<T
public enum Result<T, Error> {
...
}
相反,我想创建一个派生的StdResult类型,以便可以执行以下操作:
func myFunc() -> StdResult<String> { ... }
func myFunc()->StdResult{…}
我试过各种方法,但都找不到解决办法。例如,这不起作用:
typealias StdResult<T> = Result<T, NSError>
typealias StdResult=Result
有没有可行的解决方案?不幸的是,我们在这方面非常有限。Swift不支持泛型typealias,因此我们可以将其作为对struct的一种攻击:
struct StdResult<T> {
typealias Type = Test<T, NSError>
}
func myFunc() -> StdResult<String>.Type {
}
struct StdResult{
类型别名类型=测试
}
func myFunc()->StdResult.Type{
}
这是否足够符合您所寻找的结果?您可以为特定的结果类型别名,这样您就不必经常执行
func myThing()->Result
e、 g
typealias StringResult=结果
func myOtherThing()->StringResult
对我来说,想出一个像这样的通用解决方案更加困难
MyResult<String>
MyResult
没有准确理解
结果
在做什么。如果您发布一些内部内容,我可能会对此进行另一次尝试。目前,没有通用的typealias支持,也没有枚举继承,但您可以使用RawRepresentable
协议。这不像存在泛型typealias那么简单,但它可能适合您的需要
可代表的
发件人:
可以转换为关联的“原始”类型,然后再转换回以生成与原始类型等效的实例的类型
也就是说,您的原始值必须是
Result
:
enum StdResult:RawRepresentable{
var-rawValue:结果{
切换自身{
成功案例(let value):
返回结果。成功(值)
案例。失败(let错误):
返回结果。失败(错误)
}
}
初始化?(原始值:结果){
开关原始值{
成功案例(let value):
自我=.成功(价值)
案例。失败(let错误):
self=.Failure(错误)
}
}
成功案例(T)
案例失败(N错误)
}
func myFunc()->StdResult{}
注意:原始
结果
枚举的属性和方法只能从rawValue
属性中访问,因此,例如,如果要将新的StdResult
与另一个进行比较,您必须使用rawValue
属性或自己重新实现这些协议。重载可以满足您的需要吗?havefunc myFunc()->StdResult{…}
callfunc myFunc()->Result{…}
typealias StringResult = Result<String, NSError>
func myOtherThing() -> StringResult
MyResult<String>
public protocol RawRepresentable {
typealias RawValue
public init?(rawValue: Self.RawValue)
public var rawValue: Self.RawValue { get }
}
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> { }