2016-04-27 106 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