swift中的第一类泛型函数?

时间:2016-05-13 20:28:55

标签: swift function generics first-class

Swift具有可作为参数传递的第一类函数。

func a() {
}

func b(x: ()) {
}

// Pass a to b…
b(a)

Swift具有通用功能。

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

但是,Swift允许我将泛型函数作为参数传递给另一个函数吗?

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)

...或者它只让我传递一个泛型函数的特定实例?

如果可以,请说明定义接受泛型函数作为参数的函数的语法。

如果不支持,则解决方法是将泛型函数定义为struct或其他方法,并传递而不是传递。这并不理想,因为消费函数没有得到如此好的调用语法,他们需要这样做:

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

2 个答案:

答案 0 :(得分:4)

此功能通常称为Higher-Kinded Types(HKT),目前在Swift中不受支持。

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

答案 1 :(得分: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)