如何在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
属性或自己重新实现这些协议。

重载可以满足您的需要吗?have
func myFunc()->StdResult{…}
call
func 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> { }