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

Последнее обновление: 01.01.2018

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850