从另一个通用枚举初始化一般的Swift枚举?

时间:2016-04-27 01:06:08

标签: swift generics enums

我试图为我的通用枚举编写一个初始化程序,它使用Alamofire的通用结果枚举并将其转换为我自己的结果类型。我提出的是以下内容:

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)'

2 个答案:

答案 0 :(得分:2)

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

您可以通过更改

来修复它
init(result: Alamofire.Result) {

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

这样,显式指定了泛型参数(与Result类型的参数相同)。

我还建议你file a bug,因为这给出的错误信息非常无益。

答案 1 :(得分:0)

正如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)
        }
    }
}