Треки
/
Swift
Swift
/
Салабус
/
Перевантаження функцій
Пе

Перевантаження функцій у Swift

1 вправа

Про концепцію Перевантаження функцій

У Swift можна визначати кілька функцій з однаковою назвою, якщо їхні сигнатури відрізняються. Такий прийом називають перевантаженням функцій.

Розглянемо таку базову функцію:

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = x + y
    return doubleResult ? sum * 2 : sum
}

let twentySix = add(6, and: 7, doubleResult: true)
// => 26

У Swift дві функції з однаковою назвою вважаються різними, якщо виконується хоч одна з наведених умов:

  • У них інша кількість параметрів.
  • У них різні зовнішні мітки аргументів.
  • Їхні типи параметрів відрізняються.
  • Їхні типи поверненого значення відрізняються (за умови, що контекст виклику підказує, яку саме версію використати).

Маючи наведену вище початкову функцію add, кожне з поданих нижче перевантажень вважається окремим і його можна використати в тій самій програмі:

// 1. Different number of parameters
func add(_ x: Int, and y: Int) -> Int {
    x + y
}

let eleven = add(5, and: 6)
// => 11

// 2. Different parameter type (Double instead of Int)
func add(_ x: Double, and y: Int, doubleResult: Bool) -> Double {
    let sum = x + Double(y)
    return doubleResult ? sum * 2 : sum
}

let twentySeven = add(6.5, and: 7, doubleResult: true)
// => 27.0

// 3. Different argument label (doubleThat instead of doubleResult)
func add(_ x: Int, and y: Int, doubleThat: Bool) -> Int {
    let sum = x + y
    return doubleThat ? sum * 2 : sum
}

let thirteen = add(6, and: 7, doubleThat: false)
// => 13

Перевантаження за типом поверненого значення

Функції можна перевантажувати й лише за типом поверненого значення. Однак, викликаючи таку функцію, потрібно надати анотацію типу або контекст, щоб компілятор знав, яке з перевантажень обрати:

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Double {
    let sum = Double(x + y)
    return doubleResult ? sum * 2 : sum
}

// Ambiguous call (compiler cannot decide whether you want Int or Double):
// let thirty = add(6, and: 9, doubleResult: true)

// Resolved with an explicit type annotation:
let thirty: Double = add(6, and: 9, doubleResult: true)
// => 30.0

Що не розрізняє перевантаження

Зміна лише внутрішньої назви параметра без зміни мітки аргументу, типу параметра чи кількості параметрів не створює окремої функції. Компілятор вважає це недійсним повторним оголошенням:

func add(_ w: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = w + y
    return doubleResult ? sum * 2 : sum
}
// Error: Invalid redeclaration of 'add(_:and:doubleResult:)'
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Перевантаження функцій