Параметры передаются функциям и методам по значению — это означает, что копия параметра создается и используется в теле функции.
Параметры, полученные функциями и методами, являются неизменяемыми, то есть их значение нельзя изменить. Однако модификатор var
делает параметр изменяемым. Важно учитывать, что копия параметра является изменяемой: параметр, переданный в функцию, не имеет отношения к параметру, полученному телом функции, кроме исходной копии. Тем не менее, изменение параметра с помощью модификатора var
делает его изменяемым, но его время жизни заканчивается с телом функции и не влияет на исходный параметр, переданный в функцию.
Есть еще один вариант, модификатор inout
, который работает как var
, но когда функция возвращает значение, оно копируется обратно в переданную переменную.
Стоит отметить, что до сих пор я неявно учитывал только типы значений. Если экземпляр ссылочного типа (класса или замыкания) передается функции в качестве параметра var
, любое изменение, сделанное с помощью этого параметра, фактически выполняется для экземпляра, переданного в функцию (это наиболее существенное различие между значениями и ссылочными типами). ). Экземпляр, на который указывает переменная x
, имеет то же время жизни, что и параметр, переданный в функцию.
Все это говорит о том, что в вашем случае это работает немного по-другому. Вы возвращаете замыкание (хорошо, их 2, но это не меняет вывод), и замыкание захватывает x
, что приводит к тому, что x
сохраняется до тех пор, пока переменная, которой назначено замыкание, находится в области видимости:
let x = 5
let (getter, setter) = store(x)
В приведенном выше коде, когда getter
и setter
будут освобождены, x
(как переменная, определенная в функции store
) также перестанет существовать.
Чтобы ответить на ваши вопросы:
x
— это переменная, созданная при вызове функции store
. Поскольку вы явно указываете типы значений, то x
должно быть выделено в стеке (в отличие от кучи, которая должна использоваться для ссылочных типов)
- ловушка заключается в том, что он освобождается, когда освобождаются 2 возвращаемых значения (которые являются ссылочными типами, являющимися ссылочными типами закрытия).
- это может быть полезно в некоторых нишевых случаях, но в целом я бы держался подальше от этого - обратите внимание, что это мое собственное мнение
- уже описано выше (когда функция возвращает значения, они освобождаются)
person
Antonio
schedule
13.08.2015