Функции

Функции - это автономные фрагменты кода, которые выполняют определенную задачу. Вы даете функции имя, которое идентифицирует то, что она делает, и это имя используется для «вызова» функции для выполнения ее задачи, когда это необходимо. Параметры могут предоставлять значения по умолчанию для упрощения вызовов функций и могут передаваться как входящие и выходящие параметры, которые изменяют переданную переменную после того, как функция завершила свое выполнение.

Начнем с примера,

Предположим, у вас есть функция, которая принимает ввод Bool, переключает его значение, печатает параметр ввода после переключения. Вам также необходимо обновить значение переменной вызывающего абонента.

  • Вы можете реализовать это, используя 3 подхода.

Первый подход: функция с постоянным параметром (passByValue)

1. func toggleConstantBool(value : Bool) -> Bool {
2.      //value = !value; //can't change value of input param
3.      let complementValue = !value
4.      print(“complementValue := \(complementValue)”)
5.      return complementValue;
6. }
7.
8. var value1 = true;
9. value1 = toggleConstantBool(value1);

Параметры в функции по умолчанию - «let» (константа).

Вот почему строка №2 в приведенном выше примере недопустима. вам нужно создать новую переменную или константу, которая может хранить новое значение входного параметра для его обработки.

Но но, но… Что, если вы не хотите использовать другую переменную или константу и обрабатывать входной параметр внутри функции?

Второй подход: функция с параметром ‘var’ (passByValue)

1. func toggleVarBool(var value : Bool) -> Bool {
2.      value = !value; //this is allowed
3.      //let complementValue = !value
4.      print(“complementValue := \(value)”)
5.      return value;
6. }
7.
8. var value2 = true;
9. value2 = toggleVarBool(value2);

Если вы объявляете параметр как «var», вы можете изменить его значение внутри функции.

var с параметрами функции - устарело в Swift 2.2, удалено в Swift 3 (Предложение: SE-0003)

Но но, но… Что, если вы не хотите возвращать значение и вам необходимо изменить значение переменной вызывающего объекта?

Третий подход: функция с параметром «inout» (копирование-вход-копирование или вызов по результату значения)

1. func toggleInOutBool(inout value : Bool){
2.      value = !value;
3.      print(“complementValue := \(value)”)
4. }
5. var value3 = true;
6. toggleInOutBool(&value3);//this will also change the value of      
                           //value3 variable

Используя ключевое слово ‘inout’, вы можете передать ссылку на переменную вызывающего объекта.

Такое поведение известно как копирование-вход-копирование или вызов по значению результата.

всякий раз, когда значение переменной функции изменяется внутри функции, значение переменной вызывающей стороны также изменяется. Вам не нужно возвращать окончательное значение, оно напрямую повлияет на значение переменной вызывающего объекта.

Вы пишете параметр in-out, помещая ключевое слово inout в начало определения его параметра. Параметр ввода-вывода имеет значение, которое передается in функции, модифицируется функцией и передается обратно out функции для замены исходного значения.

Параметры ввода-вывода передаются следующим образом:

  1. При вызове функции значение аргумента копируется.
  2. В теле функции копия модифицируется.
  3. Когда функция возвращается, значение копии присваивается исходному аргументу.

В нижних индексах нельзя использовать параметры входа-выхода.