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”(这与您可能必须在其他几个更明显的地方进行的更改相同)
我对 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”(这与您可能必须在其他几个更明显的地方进行的更改相同)