2016-05-06 10 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 

私はlet、キャストのすなわち、いくつかのタイプを使用せずにVoidバージョンを呼び出すことができる方法はありますか? もう一度、私はこれが人為的な例であることを認識していますが、ここでそのオプションを理解したいと思います。

+0

私は答えを知りたいのですが、これを実際に行っている限り...しないでください。それは非常に読みやすいコードではなく、ある関数のシグニチャが変更/削除され、その関数の古い呼び出しサイトが突然 'Int'を呼び出すと、事態が爆発する可能性があります。ここは龍です。 – Alexander

+0

応答@AMomchilovをありがとう、私が言ったように、私はちょうど構文的にどのように動作するかを理解しようとしています...私は実動コードでは使用しません。 – RobertJoseph

答えて

3

あなたが結果をキャストすることにより、2つの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の代わりに使用することができますインスタンス。

関連する問題