如何消除重载函数的歧义

Rob*_*eph 4 overloading swift

这是我在学习 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
Run Code Online (Sandbox Code Playgroud)

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

vac*_*ama 6

您可以foo通过转换结果来消除这两个函数的歧义:

foo(6, y: 7) as Int

foo(6, y: 7) as Void
Run Code Online (Sandbox Code Playgroud)

或者你可以投射foo自己:

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

(foo as (Int, y: Int) -> Void)(6, y: 7)
Run Code Online (Sandbox Code Playgroud)

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