2016-04-27 103 views
1

我想为我的泛型枚举编写一个初始化器,它需要Alamofire的通用Result枚举并将其转换为我自己的Result类型。我想出来的是这样的:从另一个泛型枚举初始化一个通用的Swift枚举?

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

回答

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) 
     } 
    } 
} 
2

这似乎是与编译器推断的通用参数的方式有问题Alamofire.Result

你可以通过改变

init(result: Alamofire.Result) { 

解决它

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

这样一来,通用参数被明确指定(是一样的结果类型的参数)。

我也建议你file a bug,因为这给了错误信息是相当无益的。

+0

明确指定通用参数可以消除奇怪的编译器错误,但解决该问题会揭示甚至更怪异的段错误。在更多地使用它之后,似乎引用“MyFramework”是导致它的原因。任何想法,为什么可能是这种情况?我在回答中总结了我的发现。 – blau

+0

我没有注意到当我测试这个时,但是那时你的代码处在比我简单的测试文件更复杂的环境中。再次,我认为你应该在bugs.swift.org上提交一个bug,这样有人可以看一下它(如果它还不是已知的问题)。 – jtbandes

+0

会做什么;我将在提交错误报告之前尝试进一步分析问题。谢谢你的帮助。 – blau