如何在Swift中专门化通用枚举

时间:2015-05-29 07:45:30

标签: swift generics

我正在使用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>

是否有解决方案可行?

3 个答案:

答案 0 :(得分:2)

不幸的是我们在这里非常有限。 Swift不支持泛型类型,所以我们可以将它作为一种带有struct的黑客攻击:

struct StdResult<T> {
    typealias Type = Test<T, NSError>
}

func myFunc() -> StdResult<String>.Type {

}

这是否适合你所寻找的足够的东西?

答案 1 :(得分:1)

目前,没有通用的 typealias 支持和枚举继承,但您可以使用RawRepresentable协议。它不像普通的typealias那样容易,但它可能符合你的需要。

RawRepresentable

来自Apple's documentation

  

可以转换为关联的“原始”类型的类型,然后转换回来生成与原始类型相同的实例。

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> 正在做什么。如果你张贴一些内部人物,我可以再拿一次破解。