Здесь есть два поведения Swift:
- Swift может вывести int литерал как type float, если необходимо (или double)
- Каждый литерал имеет тип по умолчанию , который используется в случае сбоя вывода.Тип для литералов int:
Int
Только с одной функцией применяется правило 1.Он видит, что нужен float, поэтому он выводит деление как деление с плавающей точкой, а литералы int как плавающие:
func foobar(_ x: Float) -> Float {
return y
}
foobar(1/2) // 0.5
Если вы перегружаете функцию, правило 1 больше не работает.Тип теперь неоднозначный, поэтому он возвращается к типу по умолчанию Int
, который, к счастью, соответствует одному из определений:
func foobar(_ x: Int) -> Int {
return x
}
func foobar(_ x: Float) -> Float {
return y
}
foobar(1/2) // 0
Посмотрите, что произойдет, если вы сделаете так, чтобы значение по умолчанию больше не работало.Ни одно из правил не применяется, поэтому вы получите ошибку:
func foobar(_ x: Double) -> Double {
return x
}
func foobar(_ x: Float) -> Float {
return y
}
foobar(1/2) // Ambiguous use of operator '/'