【问题标题】:Initializing a generic Swift enum from another generic enum?从另一个通用枚举初始化一个通用 Swift 枚举?
【发布时间】:2016-04-28 02:34:25
【问题描述】:

我正在尝试为我的通用枚举编写一个初始化程序,它采用 Alamofire 的通用 Result 枚举并将其转换为我自己的 Result 类型。我想出的是以下内容:

public enum Result<Value, Error: ErrorType> {
    case Success(Value)
    case Failure(Error)

    public init(result: Alamofire.Result) {
        switch(result) {
        case Alamofire.Result.Success(let val):
            self = MyFramework.Result.Success(val)
        case Alamofire.Result.Failure(let err):
            self = MyFramework.Result.Failure(err)
        }
    }
}

但是我遇到了以下错误:

Cannot invoke 'Success' with an argument list of type '(Value)'

【问题讨论】:

    标签: swift generics enums


    【解决方案1】:

    这似乎是编译器推断Alamofire.Result 的泛型参数的方式有问题。

    你可以通过改变来修复它

    init(result: Alamofire.Result) {
    

    init(result: Alamofire.Result<Value, Error>) {
    

    这样,通用参数被显式指定(与您的 Result 类型的参数相同)。

    我也推荐你file a bug,因为它给出的错误信息非常无用。

    【讨论】:

    • 显式指定泛型参数可以消除奇怪的编译器错误,但解决该问题会发现更奇怪的段错误。在玩了一些之后,似乎对MyFramework 的引用是导致它的原因。关于为什么会这样的任何想法?我在回答中总结了我的发现。
    • 我在测试这个时没有注意到,但是你的代码比我的简单测试文件处于更复杂的环境中。同样,我认为您应该在 bugs.swift.org 提交一个错误,以便有人可以查看它(如果它还不是已知问题)。
    • 会的;在提交错误报告之前,我将尝试进一步隔离问题。感谢您的帮助。
    【解决方案2】:

    正如 jtbandes 建议的那样,显式指定泛型参数类型可以消除神秘的编译器错误。但是,一旦解决了这个问题,我就会遇到一个更加神秘的段错误。

    经过一番尝试,删除对MyFramework 的引用似乎可以解决段错误,无论出于何种原因。以下代码编译正常:

    public enum Result<Value, Error: ErrorType> {
        case Success(Value)
        case Failure(Error)
    
        public init(result: Alamofire.Result<Value, Error>) {
            switch(result) {
            case Alamofire.Result.Success(let val):
                self = .Success(val)
            case Alamofire.Result.Failure(let err):
                self = .Failure(err)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2013-03-05
      • 2017-04-01
      • 1970-01-01
      相关资源
      最近更新 更多