Swift 3 闭包重载解析

Swift 3 closure overload resolution

我对 Swift 3.

中带有闭包的函数重载解析感到困惑

例如代码中:

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

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

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

我希望 Narrow 而不是 Wide 打印到控制台。谁能解释为什么为非闭包参数选择了更具体的重载,而不是为闭包​​参数选择了更具体的重载,或者这是一个编译器错误?

Swift 2 表现出了预期的行为。

这可能是由于更改了闭包参数的默认“转义”行为。

如果将具体函数改成:

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

它将按预期打印“Narrow”(这与您可能必须在其他几个更明显的地方进行的更改相同)