func myfunc<T>(i:T) -> T {
return i
}
是否有可能使這個通用函數成爲閉包?是否可以在Swift中創建通用閉包?
let myfunc = { <T>(i:T) -> T in
return i
}
這行不通......
func myfunc<T>(i:T) -> T {
return i
}
是否有可能使這個通用函數成爲閉包?是否可以在Swift中創建通用閉包?
let myfunc = { <T>(i:T) -> T in
return i
}
這行不通......
沒有,因爲變量和表達式不能通用。只有通用函數和通用類型。
澄清:在某些語言中,您可以使用通用量詞類型,如forall a. a -> a
。但在Swift中,類型不能有一個通用的量詞。所以表達式和值不能是通用的。函數聲明和類型聲明可以是通用的,但是當你使用這樣的通用函數或者這樣的泛型類型的實例時,選擇某種類型(可以是實型或類型變量)作爲類型參數,然後你獲得的價值不再是通用的。
你是對的,謝謝你,謝謝Rob Napier。 – 2014-08-29 03:17:36
我同意Rob的意思,它應該將'typealias'與閉包一起使用來定義通用閉包類型 – Mazyod 2015-10-06 20:24:49
在大多數編程語言中,泛型函數參數實際上只是函數參數,其中的值-時間。所以這意味着泛型參數的可能值是在編譯時計算的,而不是僅僅在運行時使用(如普通函數/閉包參數)。優點是能夠用編譯時需要評估的類型對閉包進行參數化,例如, 'StringLiteralConvertible'。我認爲你的困惑在於把變量或表達看作通用的;相反,它是通用的關閉。 – 2016-06-22 03:18:18
類似(相同?)問題在這裏:http://stackoverflow.com/questions/25401584/generics-as-parameters-to-aclosure-in-swift。 – 2014-08-28 09:28:26
泛型不能用於閉包。 @MartinR鏈接的答案提供了一種解決方法。我不認爲這個問題是重複的,因爲另一個問題是關於泛型工作的封閉,而這是泛型是否可以使用的明確問題。 – Antonio 2014-08-28 09:41:09
我相信答案是這不起作用,因爲它實際上沒有任何意義(特別是與Swift無關)。 'myfunc'應該是一個抽象類型,這與試圖構造一個抽象類相同。我在@MartinR鏈接的回答中討論更多。 – 2014-08-28 13:40:17