2014-10-10 72 views
0

考慮這個通用的方法(只有類型非常重要,沒有它做什麼):將顯式返回值添加到閉包導致編譯器錯誤:編譯器錯誤?

func flatMap<SourceType, TargetType>(source: [SourceType], transform: SourceType [TargetType]) -> [TargetType] { 
    return [] 
} 

以下方法調用編譯很好:

let seq = flatMap(["some", "string"], { s in [1, 2] }) 

然而,僅僅增加顯式返回到封閉的情況下編譯錯誤:

let seq = flatMap(["some", "string"], { s in return [1, 2] }) //ERROR: Cannot convert the expression's type ... to type 'StringLiteralConvertible' 

編譯器仍然可以按照與第一種情況相同的方式推斷出類型,對嗎?區別在哪裏(我看不到)?如果我需要return,如何編譯第二個案例?

+0

這看起來像是一個編譯器bug。 – dasblinkenlight 2014-10-10 18:15:54

+0

@dasblinkenlight我也會這麼說。我想驗證它,因爲關於Swift類型系統有幾個我認爲是bug的東西,但是在發佈到SO之後,向我解釋它們意味着它們是如此甚至是特徵。 – drasto 2014-10-10 18:30:19

回答

0

它的工作原理,如果你做出明確關閉的返回類型:

let seq = flatMap(["some", "string"], { s -> [Int] in return [1, 2] }) 

有趣的是,如果通用值未被定義其他地方,它纔會發生。所以數組排序關閉不具備此問題:

[1,2,3].sorted{a,b in return a < b} //works 

如果你因爲某些原因,添加參數與TargetType的運作,它也可以工作:

func flatMap<SourceType, TargetType>(source: [SourceType],aTarget:TargetType, transform: SourceType -> [TargetType]) -> [TargetType] { 
    return [] 
} 

let seq = flatMap(["some", "string"], 1, {s in return [1, 2]}) //works 

這是無論是編譯器錯誤還是強迫事情在潛在模糊情況下更明確的方式。