2016-05-06 25 views
2

這是我在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 

有沒有一種方法,我可以調用Void版本不使用let,即某種類型的演員? 同樣,我意識到這是一個人爲的例子,但我想了解這裏的選項。

+0

我很想知道答案,但就實際做這個...不。這不是很可讀的代碼,如果一個函數簽名被改變/刪除,那麼或許事情可能會爆炸,而突然之間,那個舊函數調用網站調用「Int」函數。這裏是龍。 – Alexander

+0

感謝您的回覆@AMomchilov,但正如我所說,我只是想了解這是如何工作的語法...我不會在生產代碼中使用它。 – RobertJoseph

回答

3

您可以通過將結果歧義兩個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中都要使用實例。