2016-06-14 42 views
0

我在Swift中編譯測試用例時遇到了問題。它看起來像編譯器丟失有關模板類型的信息,但其他通用方法工作正常。我錯過了什麼?Swift通用函數不能在測試中編譯

public class MatchNorm { 

    public static func resolve1<T:SequenceType where T.Generator.Element:MatchNormElement>(list: T, lti: LinearTransformation, accuracy: Double) -> LinearTransformation { 
     // no problem 
     return MatchNorm.resolve1(list, lti: lti, accuracy: accuracy) 
    } 

    public static func resolve2<T:SequenceType where T.Generator.Element:MatchNormElement>(list: T, lti: LinearTransformation, accuracy: Double) -> LinearTransformation { 

     for elem in list { 
      print(elem.x) 
     } 
     return lti 
    } 
} 
public class MatchNormTest: XCTestCase { 
    func testMatchNorm1() { 
     var list = [MatchNormElement]() 

     // compilation error here! 
     let ll = MatchNorm.resolve1(list, lti: LinearTransformation(1), accuracy: 0.001) 
// MatchNormTest.swift:70:29: Cannot invoke 'resolve1' with an argument list of type '([MatchNormElement], lti: LinearTransformation, accuracy: Double)' 
// MatchNormTest.swift:70:29: Expected an argument list of type '(T, lti: LinearTransformation, accuracy: Double)' 
    } 
} 

更新

MatchNormElement是一個協議,所以我改成了具體類型。現在它可以工作。

func testMatchNorm1() { 
    var list = [Measurment]() 

     // works fine 
    let ll = MatchNorm.resolve1(list, lti: LinearTransformation(1), accuracy: 0.001) 
} 
+1

我用'NSString'替換了'MatchNormElement'和'LinearTransformation'(並且刪除了'resolve2',這個方法對於查找問題不需要),並且沒有編譯錯誤。也許這些信息會幫助你。 –

+0

感謝ShadowOf。 MatchNormElement是一個協議。它看起來像列表必須具體的類型。 –

回答

1

這對編譯器來說是合理的。 Swift允許將具體類型的類型轉換爲基於協議的變量賦值。

但是,Swift不允許通過轉換一組具體類型到協議集/數組。這是合理的,因爲以下幾個原因:

讓我們假設有這種構造的地方:

protocol IntType {} 
extension Int: IntType{} 

現在讓我們做明顯的事:

let item = 12 
let item2:IntType = item 

然後將看一個明顯對眼睛:這不會很好的理由編譯。

let a = [1,2,3] 
let b: [IntType] = a 

允許向前移動之前檢查每個類型的大小:

sizeofValue(item) //8 
sizeofValue(item2) //40 

數組是8個字節的傳染性存儲器。所以Array是一個40字節的傳染性內存。

當我們這樣做:

let b: [IntType] = a 

我們基本上是告訴編譯器8個字節數組轉換爲40個字節數組和存儲。現在,由於數組具有傳染性,它必須破壞或重新組合,這是昂貴的任務。這妨礙了性能,顯然你會失去類型安全。

編譯器會這樣這種轉變,但雨燕車隊決定有很好的理由,用戶需要明確,如果他們想有兩個原因這種類型的轉變:性能式安全