【问题标题】:How to pass any function as a parameter and execute it in Swift?如何将任何函数作为参数传递并在 Swift 中执行?
【发布时间】:2017-04-13 15:53:42
【问题描述】:

我正在尝试编写一个可以将任何函数作为参数并在 Swift 中执行的函数。我试过这种方法:

public func anyFunc<P, T> (_ function: (P...) -> T) {
    _ = function()    
}

然后尝试:

anyFunc(print("hello"))

这会产生ERROR: 'print' produces '()', not the expected contextual result type '(_...) -&gt; _'

我怎样才能做到这一点(是否可行)?

【问题讨论】:

  • 你为什么使用&lt;P, T&gt;?传递的函数是否应该返回 void?
  • print("hello") 是对函数print调用,它返回一个结果(空元组())。因此,您对anyFunc 的调用等效于anyFunc(()),这自然是与anyFunc 的参数不匹配。
  • 一般情况下,如果function() 接受任意数量的参数,您如何期望在不传递任何参数的情况下调用它?
  • @dfri 因此我的问题:-)
  • @jtbandes 如果你传递一个带有 2 个 args 的函数,AnyFunc 会用这两个 args 执行这个函数。如果你通过 0 args 传递一个,它会用 0 args 执行它。如果你传递一个带有 8 个 args 的参数,它会使用 8 个 args 执行它。 如何将任何函数作为参数传递然后执行?我正在尝试在 Swift 中实现 debounce 方法:lodash.com/docs/#debounce

标签: swift function parameter-passing


【解决方案1】:

只使用@autoclosure 怎么样:

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

anyFunc(print("hello"))

【讨论】:

  • 这正是我所需要的!我不知道@autoclosure。我还在末尾添加了Treturn result 的返回类型。谢谢
猜你喜欢
  • 2017-11-04
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2012-12-27
相关资源
最近更新 更多