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)
此功能通常称为 Higher-Kinded Types (HKT),目前 Swift 不支持。
我意识到,在提出这个问题五年后,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
传递给通用代码并提供有用的行为。
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)
此功能通常称为 Higher-Kinded Types (HKT),目前 Swift 不支持。
我意识到,在提出这个问题五年后,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
传递给通用代码并提供有用的行为。