В Swift нам доступен механизм перегрузки функций, то есть мы можем определять функции с одним и тем же именем, но разным количеством или типом параметров:
func sum(_ x: Int, _ y : Int){ print(x+y) } func sum(_ x: Double, _ y: Double){ print(x+y) } func sum(_ x: Int, _ y: Int, _ z: Int ){ print(x + y + z) } sum(1, 2) // 3 sum(1.2, 2.3) // 3.5 sum(2, 3, 4) // 9
В данном случае все три функции называются sum, но так как они отличаются либо по количеству параметров, либо по их типу. При вызове данной функции Swift по типу и количеству параметров сможет распознать, какую именно версию функции sum надо использовать.
Также перегруженные версии одной функции могут отличаться по типу возвращаемого значения:
func sum(_ x: Int, _ y : Int) -> Int{ return x + y } func sum(_ x: Int, _ y : Int) -> Double{ return 2 * Double(x + y) // преобразует результат в Double } let a : Int = sum(1, 2) // 3 let b : Double = sum(1, 2) // 6.0 print(a) // 3 print(b) // 6.0
В данном случае определены две версии функции sum, которые совпадают по типу и количеству параметров, но различаются по типу возвращаемого значения.
Константа a
представляет тип Int, поэтому в выражении let a : Int = sum(1, 2)
компилятор увидит,
что необходима версия, которая возвращает значение Int, и будет использовать эту версию. Аналогично в выражении
let b : Double = sum(1, 2)
константа b
представляет тип Double, поэтому здесь будет применяться версия функции
sum, которая возвращает значение Double. То есть в данном случае у нас ошибок не возникнет.
Однако теперь рассмотрим другую ситуацию:
func sum(_ x: Int, _ y : Int) -> Int{ return x + y } func sum(_ x: Int, _ y : Int) -> Double{ return 2 * Double(x + y) // преобразует результат в Double } let a = sum(1, 2) // Ошибка let b = sum(1, 2) // Ошибка
Здесь явным образом не указано, какой тип представляют константы a и b, поэтому их тип будет выводиться изрезультата
вызова sum(1, 2)
. Но теперь компилятор не знает, какую именно версию функции sum использовать, так как тип констант неизвестен. В итоге
в данном случае мы столкнемся с ошибкой.