繁体   English   中英

如何在Swift中专门化泛型枚举

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM