2016-11-29 77 views
3

我試圖編寫一個函數,它可以將任何函數作爲參數並在Swift中執行。我曾嘗試這個辦法:如何將任何函數作爲參數傳遞並在Swift中執行?

public func anyFunc<P, T> (_ function: (P...) -> T) { 
    _ = function()  
} 

,然後用嘗一嘗:

anyFunc(print("hello")) 

這將產生ERROR: 'print' produces '()', not the expected contextual result type '(_...) -> _'

我怎樣才能做到這一點(和是可行的)?

+0

?傳遞的函數是否應該返回void? –

+3

'print(「hello」)'是_a調用函數print',它返回一個結果(空元組'')'。因此,你對'anyFunc'的調用等價於'anyFunc(())',這對於'anyFunc'的參數自然是不匹配的。 – dfri

+0

一般來說,如果需要任意數量的參數,您希望如何在不傳遞任何參數的情況下調用'function()'? – jtbandes

回答

3

如何只使用@autoclosure,就像這樣:你爲什麼要使用``

func anyFunc<T>(_ closure: @autoclosure() -> T) { 
    let result: T = closure() 
    // TODO: Do something with result? 
} 

anyFunc(print("hello")) 
+0

這正是我需要的!我不知道'@ autoclosure'。我還在末尾添加了返回類型「T」和「返回結果」。謝謝 – ilovebigmacs

相關問題