Перегрузка функций


В Swift нам доступен механизм перегрузки функций, то есть мы можем определять функции с одним и тем же именем, но разным количеством или типом параметров:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 надо использовать.

Также перегруженные версии одной функции могут отличаться по типу возвращаемого значения:

1
2
3
4
5
6
7
8
9
10
11
12
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. То есть в данном случае у нас ошибок не возникнет.

Однако теперь рассмотрим другую ситуацию:

1
2
3
4
5
6
7
8
9
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 использовать, так как тип констант неизвестен. В итоге в данном случае мы столкнемся с ошибкой.