#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")
}
он будет печатать «узкий», как и ожидалось (это то же самое изменение, которое вам, вероятно, пришлось внести в нескольких других местах, которые были более очевидными)