如何消除函数重载的歧义

4

这是我在学习Swift函数重载时编写的完全虚构的示例。以下函数仅在返回类型上有所不同(第一个函数隐式返回Void/ (),而另一个函数返回Int)。

func foo(x:Int, y:Int) {
}

func foo(x:Int, y:Int) -> Int {
  return 0
}

// Call the version which returns Int
let i: Int = foo(6, y: 7)

// Call the version which returns Void
let v: Void = foo(6, y: 7)

// Ambiguous
foo(6, y:7)  // How can I force a call to the Void version without using let/var?

// I thought this might work but doesn't
foo(6,y: 7) as (Int, Int) -> Void

有没有一种方法可以在不使用let的情况下调用Void版本,即某种类型的转换?再次强调,我意识到这是一个人为的示例,但我想了解这里的选项。


我很好奇想知道答案,但实际上不要这样做。这不是非常易读的代码,而且如果更改/删除一个函数签名,那么所有旧的调用该函数的调用站点可能会突然调用“Int”函数,从而导致一些问题。这里有风险。 - Alexander
谢谢您的回复@AMomchilov,但正如我所说,我只是想理解这个语法是如何工作的... 我不会在生产代码中使用它。 - RobertJoseph
1个回答

6
您可以通过将结果强制转换来消除这两个foo函数的歧义:
foo(6, y: 7) as Int

foo(6, y: 7) as Void

或者您可以直接使用foo本身:

(foo as (Int, y: Int) -> Int)(6, y: 7)

(foo as (Int, y: Int) -> Void)(6, y: 7)

注意:在这两种情况下,可以使用()替换Void

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