【问题标题】:Swift. How to get generic type from extension?迅速。如何从扩展中获取泛型类型?
【发布时间】:2016-05-13 09:16:26
【问题描述】:

我正在尝试编写泛型类型的扩展,但由于某些原因无法正常工作。

我有通用枚举:

public enum ResponseResult<Result, Error> {

    case Success(result: Result)
    case Failure(error: Error?)
}

我想为这个枚举写一些扩展,例如用枚举泛型参数创建另一个泛型类:

    extension ResponseResult {

        var response: Response<T> {
            return Response(value: self.value)
        }
    }

T - 是来自 ResponseResult 类的“Result”通用参数。 但我不明白如何在扩展中获取泛型参数。

【问题讨论】:

  • 不清楚你需要T做什么,为什么会在那里?
  • @Pascal 是 Response 类的通用参数。我正在尝试编写简单的代码示例,而不是放置所有代码
  • 所以你只想在扩展中使用ResponseResult枚举中的Result泛型参数?您是否尝试过只输入Result 而不是T?原始声明中的泛型参数应该在扩展中可用。
  • 啊哈。是的,那么很明显,就像其他人已经回复的那样,您的意思是Result。 :)

标签: ios swift generics enums extension-methods


【解决方案1】:

要从枚举值中提取参数,可以使用switch-case

switch response {
case .Success(let result):
    print("Success: \(result)")
case .Failure(let error):
    print("Error: \(error)")
}

如果您在扩展程序中,只需将 response 替换为 self

在您的特定场景中,也许这就是您正在寻找的:

extension ResponseResult {

    var response: Response<Result>? {
        switch self {
            case .Success(let result):
                return Response(value: result)
            case .Failure: // Ignore error parameter
                return .None
        }
    }
}

该模式与Alamore 用于错误处理的模式非常相似(完全相同)。您可以查看他们的代码和文档以获取更多示例。

【讨论】:

  • 谢谢!没想到这么简单的方法=)
猜你喜欢
  • 2021-03-25
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2019-05-24
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多