2016-05-06 47 views
3

我有這個帶2個構造函數的小枚舉。當我嘗試使用Int參數初始化時,出現"Generic parameter 'T' could not be inferred"錯誤。「過載方法時無法推斷出通用參數'T'錯誤

import UIKit 

public enum Result<T> { 

case Success(T) 
case Failure(Int) 

    init(any: T) { 
     self = .Success(any) 
    } 

    init(number: Int) { 
     self = .Failure(number) 
    } 
} 

let a = Result(any: "A String") 
print(a) 

let b = Result(number: 1) 
print(b) 

有什麼辦法在T排除Int或以某種方式在第二初始化器優先?

在XCode 7.3.1上測試。

+0

編譯器是正確的。 「Result(number:1)」中的T是什麼? – werediver

回答

2

的問題不在於它的誤認要使用的構造函數,問題是,它需要知道正確的,然後,當你鍵入結果(編號:1)什麼類型T會。它不能將其作爲運行時的通配符T,必須在編譯時解決。

所以,你可以這樣做:

let b = Result<String>(number: 1) //letting it know that T would be a String. 

的原因,這是很重要的是因爲 - 說你想放一堆結果的一個數組嘛......你不能把Result-Int與Result-String在同一個數組中(除非該數組的類型爲Any),因爲它與在數組中放入Int和String非常相似。總之,Result不僅僅是一種類型,它是一組類型。

我希望這對你有幫助!

2

實際上,在你的例子中,不可能從表達式Result(number: 1)推斷出類型參數T

您需要將所有必要的信息提供給編譯器。在此略作修改例子看看:

public enum Result<T> { 

    case Success(T) 
    case Failure(Int) 

} 

let a = Result.Success("A String") 
print(a) 

let b: Result<String> = .Failure(1) 
print(b) 
相關問題