https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html
Параметры входа-выхода
По умолчанию параметры функции являются константами. Попытка изменить значение параметра функции из тела этой функции приводит к ошибке времени компиляции. Это означает, что вы не можете изменить значение параметра по ошибке. Если вы хотите, чтобы функция изменяла значение параметра, и вы хотите, чтобы эти изменения сохранялись после завершения вызова функции, вместо этого определите этот параметр как параметр входа-выхода.
Вы пишете параметр in-out, помещая ключевое слово inout прямо перед типом параметра. Параметр входа-выхода имеет значение, которое передается в функцию, модифицируется функцией и передается обратно из функции для замены исходного значения. Подробное обсуждение поведения параметров ввода-вывода и связанных оптимизаций компилятора см. В разделе Параметры ввода-вывода.
Вы можете передавать только переменную в качестве аргумента для входящего-выходного параметра. Вы не можете передать константу или буквальное значение в качестве аргумента, потому что константы и литералы не могут быть изменены. Вы помещаете амперсанд (&) непосредственно перед именем переменной, когда передаете его в качестве аргумента входному-выходному параметру, чтобы указать, что он может быть изменен функцией.
ПРИМЕЧАНИЕ
Параметры входа-выхода не могут иметь значений по умолчанию, а переменные параметры не могут быть помечены как входящие.
Вот пример функции swapTwoInts (: :), которая имеет два целочисленных параметра входа-выхода, называемых a и b:
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
Функция swapTwoInts (: :) просто меняет местами значение b на a, а значение a на b. Функция выполняет этот обмен, сохраняя значение a во временной константе с именем временнаяA, присваивая значение b переменной a, а затем присваивая временную переменную b.
Вы можете вызвать функцию swapTwoInts (: :) с двумя переменными типа Int, чтобы поменять местами их значения. Обратите внимание, что имена someInt и anotherInt имеют префикс амперсанда, когда они передаются в функцию swapTwoInts (: :):
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
В приведенном выше примере показано, что исходные значения someInt и anotherInt изменяются функцией swapTwoInts (: :), даже если они изначально были определены вне функции.
ПРИМЕЧАНИЕ
Параметры ввода-вывода - это не то же самое, что возвращаемое значение из функции. Приведенный выше пример swapTwoInts не определяет тип возвращаемого значения и не возвращает значение, но по-прежнему изменяет значения someInt и anotherInt. Параметры ввода-вывода - это альтернативный способ для функции иметь эффект, выходящий за рамки ее тела функции.
person
Mustafa Mohammed
schedule
31.01.2017
public func getQuestionList(inout language: String) -> NSArray- person TotoroTotoro   schedule 22.03.2016getQuestionбыли какие-либо побочные эффекты. - person BallpointBen   schedule 31.03.2016func foo(_ bar: int) { /*use bar*/ bar+=1; foo(bar); }. Это невозможно без параметров var. Вам нужно либо создать отдельную переменную внутри функции и скопировать значение, либо пометить параметр как inout. Первый медленный, второй вызывает неопределенное поведение. Многие алгоритмы используют такую рекурсию. - person kevin   schedule 22.10.2018foo(bar + 1)? - person Mike Taverne   schedule 22.10.2018barне int, а сложный объект? - person kevin   schedule 23.10.2018