Разрешение перегрузки при закрытии Swift 3

#swift #closures #overloading #swift3 #overload-resolution

#swift #закрытие #перегрузка #swift3 #разрешение перегрузки

Вопрос:

Меня смущает разрешение перегрузки функций при закрытии в 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 продемонстрировал ожидаемое поведение.

Комментарии:

1. Для меня не очевидно, какое поведение «ожидается», но, безусловно, верно, что Swift 2 и Swift 3 дают здесь разные ответы. Если это влияет на вас каким-либо решающим образом, обязательно отправьте сообщение об ошибке с bugs.swift.org ; по крайней мере, вы получите хороший ответ, часто менее чем за день.

2. Да, «ожидается» просто как в «Я лично не ожидал, что это изменится».

Ответ №1:

Вероятно, это связано с изменением поведения «экранирования» по умолчанию для параметров закрытия.

Если вы измените конкретную функцию на:

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

он будет печатать «узкий», как и ожидалось (это то же самое изменение, которое вам, вероятно, пришлось внести в нескольких других местах, которые были более очевидными)