2016-10-01 5 views
3

Iコードで、例えば3はスウィフト3クロージャがオーバーロード解決

スウィフトにクロージャと機能過負荷解像度によって混乱している:私はNarrow、ないWide期待

func f<T>(_ a: T) { 
    print("Wide") 
} 

func f(_ a: (Int)->(Int)) { 
    print("Narrow") 
} 

f({(a: Int) -> Int in return a + 1}) 

、印刷されますコンソールに接続します。クローズの引数ではなく、コンパイラのバグではなく、より具体的なオーバーロードが選択される理由を誰でも説明できますか?

スウィフト2が期待される挙動を示した。

+0

Swift 2とSwift 3が異なる答えを出すのは間違いないでしょう。これがいくつかの重要な点であなたに影響する場合は、確かにhttps://bugs.swift.orgでバグを報告してください。少なくとも1日以内に良い答えを得るでしょう。 – matt

+0

ええ、「私は個人的にはこれが変わるとは期待していませんでした。 –

答えて

1

これは、おそらく、クロージャパラメータのデフォルトの「エスケープ」動作が変更されたためです。

あなたが特定の機能を変更する場合:

func f(_ a:@escaping (Int)->Int) 
{ 
    print("Narrow") 
} 

予想通り、それは「狭い」に印刷されます(この本は、おそらくより明白だったいくつかの他の場所でなければなりませんでした同じ変更)

関連する問題