Что делает параметр `inout` в Swift?

«Что делает параметр `inout` в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Параметр inout позволяет передавать переменную в функцию по ссылке, чтобы её модифицировать внутри функции, и изменения сохранялись после её завершения. По умолчанию параметры в Swift передаются по значению (создаётся копия).

Пример использования:

func swapValues(_ a: inout Int, _ b: inout Int) {
    let temp = a
    a = b
    b = temp
}

var x = 5
var y = 10
swapValues(&x, &y) // Передача с амперсандом &
print(x, y) // Вывод: 10, 5

Ключевые правила и нюансы:

  • Можно передавать только переменные (var), но не константы (let) или литералы.
  • При вызове функции перед аргументом обязательно ставится &.
  • Нельзя передавать вычисляемые свойства (без явного геттера/сеттера) или свойства, являющиеся константами.
  • Использование inout для больших структур может повлиять на производительность, так как происходит копирование при входе и выходе из функции (copy-in copy-out семантика).