swift 中的第一个 class 泛型函数?

First class generic function in swift?

Swift 有第一个 class 函数可以作为参数传递。

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)

…还是只让我传递泛型函数的特定实例?

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

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

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

是的,这是一个例子:

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)

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

然而,discussed on the swift-evolution mailing list

我意识到,在提出这个问题五年后,Swift 支持类似这样的东西,可以通过 callAsFunction 使用。

这是一个例子:


final class Service<T> {
    // Implementation here
}

final class Attacher {
    // Important state here.
    var state = Void()
    
    func callAsFunction<T>(service: Service<T>, to: T) {
        // Implementation here.
    }
}

func doAttaching(attach: Attacher) {
    attach(service: Service<Int>(), to: 42)
    attach(service: Service<String>(), to: "Hello World!")
}

可以将 Repeater 传递给通用代​​码并提供有用的行为。