如何将任何函数作为参数传递并在Swift中执行?

10
我正在尝试编写一个函数,它可以将任何函数作为参数并在Swift中执行。我已经尝试过以下方法:
public func anyFunc<P, T> (_ function: (P...) -> T) {
    _ = function()    
}

然后尝试使用以下方法:

anyFunc(print("hello"))

这会产生一个错误:'print'产生了'()',而不是预期的上下文结果类型'(_...) -> _'。

我该如何实现这个(并且这可行吗)?


你为什么要使用 <P, T>?传递的函数是否应该返回 void? - Ahmad F
3
print("hello") 是对函数 print 的调用,它返回一个结果(空元组 ())。因此,你对 anyFunc 的调用相当于 anyFunc(()),这显然与 anyFunc 的参数不匹配。 - dfrib
一般来说,如果一个函数接受任意数量的参数,你希望如何在不传递任何参数的情况下调用它? - jtbandes
@dfri 因此我才问的 :-) - ilovebigmacs
1
如果您传递了一个带有两个参数的函数,AnyFunc会使用这两个参数执行此函数。 如果您传递一个不带参数的函数,则它将使用0个参数执行它。 如果您传递一个带有8个参数的函数,则它将使用这8个参数执行它。如何将任何函数作为参数传递并执行?我正在尝试在Swift中实现此处的“debounce”方法:https://lodash.com/docs/#debounce - ilovebigmacs
显示剩余2条评论
1个回答

8
如何仅使用@autoclosure,例如:

像这样:

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

anyFunc(print("hello"))

1
这正是我所需要的!我不知道@autoclosure。我还在结尾处添加了一个返回类型为Treturn result。谢谢! - ilovebigmacs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接