【问题标题】:Why is forwarding variadic parameters invalid?为什么转发可变参数无效?
【发布时间】:2017-06-10 03:00:06
【问题描述】:

考虑可变参数函数:

func foo(bar:Int...) -> () { }

这里foo 可以接受多个参数,例如foo(5,4)。我很好奇Int... 的类型及其支持的操作。例如,为什么这无效?

func foo2(bar2:Int...) -> () {
    foo(bar2);
}

给出错误:

找不到接受提供的参数的“_conversion”的重载

为什么转发可变参数无效?

编译器抱怨的“转换”是什么?

【问题讨论】:

标签: swift variadic-functions


【解决方案1】:

当您调用foo 时,编译器需要一系列参数,每个参数都必须是Int

foo2 的主体中,bar2 汇总了所有传递的参数,并且实际上具有所有实际用途的Int[] 类型。因此,您不能将其直接传递给foo——因为foo 需要Int 参数,而不是Int[]

至于解决方案:请参阅我对this question 的回答。

【讨论】:

  • 是否有办法将Int[] 转换为一系列参数,以便用户尝试完成的工作能够完成?
  • 所以在foo 的正文中,您基本上可以将bar 视为Int[]
  • stackoverflow.com/questions/24046142/…。基本上,您使用 Int[] 参数重载 foo
  • @awesomeyi 是的,就是这样。
  • 是的,至少部分是。希望该语言可以在未来的版本中提供更好的解决方案。
【解决方案2】:

您可以转发可变参数,但您转发它的函数必须使用数组参数定义,而不是可变参数。所以把你的 foo 函数写成

func foo(bar:[Int]) -> () { }

它有效。

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 2021-12-21
    • 2011-08-17
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多