2016-05-13 58 views
4

Swift具有可以作爲參數傳遞的第一類函數。swift中的第一類泛型函數?

func a() { 
} 

func b(x:()) { 
} 

// Pass a to b… 
b(a) 

Swift具有泛型函數。

func generic<T>(x: T) { 
} 

但是,確實斯威夫特讓我過去一通用函數作爲參數傳遞給另一個函數?

let anIntService = Service<Int>() 
let astringService = Service<String>() 

func attach<T>(service: Service<T>, to value: T) { 
    // Perform type safe attaching of `value` to `service`. 
} 

func doAttaching(attach: (Service<T>, to T)->Void) { 
    attach(anIntService, to: 42) 
    attach(aStringService, to: "Hello World!") 
} 

doAttaching(attach) 

...或者它只是讓我傳遞一個通用函數的特定實例嗎?

如果可能,請說明定義接受泛型函數作爲參數的函數的語法。

如果這不被支持,一種解決方法是將通用函數定義爲結構的某個方法,或者傳遞一個方法來代替那個方法。這是不理想的現象,因爲消費的功能沒有得到這麼好的調用語法,他們需要做的:

func doAttaching(attach: Attacher) { 
    attacher.attach(anIntService, to: 42) 
    attacher.attach(aStringService, to: "Hello World") 
} 

回答

0

是的,這裏有一個例子:

func identity<T>(param: T) -> T { 
    return param 
} 

func callFunction<U>(function: U->U, paramater: U) -> U { 
    return function(paramater) 
} 

let param = 123 

let result = callFunction(identity, paramater: param); 

print(result) 

(You can run it here)

+1

感謝您的回覆,但我不認爲這就是我所需要的。所以,在你的例子'callFunction'中被調用的函數,仍然沒有得到通用函數。它得到了一個特定的實例,由你調用的'parameter'的類型決定 - 在本例中爲'123',所以Int。我想在您的示例中將'identity'作爲_fully generic_函數傳遞給'callFunction'。然後'callFunction'的定義可以用多種類型調用它的'function'參數。 – Benjohn

+0

哦,我看到了,對不起,我誤解了這篇文章:( – Alexander

+0

沒問題!謝謝無論如何:-) – Benjohn

4

此功能通常稱爲Higher-Kinded Types(HKT),目前在Swift中尚未支持。

然而,它已經是discussed on the swift-evolution mailing list

+0

哈!真? :-)這很有趣,因爲我過去幾次閱讀過更高級別的類型,並且完全不知道他們在說什麼。現在我明白了!超級 - 它會成爲可愛的,如果它使未來的版本。感謝您的答覆。 – Benjohn