Swift: Functions (Функции)

В общем виде:
func имяФункции(список переменных) -> Тип возвращаемого значения

Пример:

Этот пример интересен тем, что функция возвращает optional tuple (опциональный кортеж), что позволяет вызвать эту функцию и работать с возвращаемым значением, либо корректно обработать отсутствие результата

В консоль выведется: result

Поговорим о правиле вызова функции.
Swift 1.2
При вызове функции мы не можем указывать внутренне имя аргумента

concat(«1», «2») // правильно
concat(«1″, to:»2») // неправильно

Swift 2.0
При вызове функции мы обязаны опускать внутренне имя для первого аргумента и обязательно указывать для всех последующих (внутреннеИмя : параметр).

External Parameter Names (Внешние имена параметров)
В целях самодокументирования кода добавлены внешние имена параметров, при определении функции они указываются перед внутренним именем параметра, и при вызове функции используются именно они

И еще о расхождениях между swift 1.2 и 2.0
В 1.2 как я уже говорил, при вызове функции если все параметры имеют только внутренние имена — их указывать нельзя. Но если внешнее имя должно совпадать с внутренним — перед именем при определении функции нужно указать знак решетки #

В Swift 2.0 — такую возможность убрали (по умолчанию все внутренние имена начиная со второго аргумента являются внешними и обязательными к указанию при вызове функции)
Т.е. если взять предыдущий код и убрать решетку, вызов функции останется верным.

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

Variable parameter (Изменяемый параметр)

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

Для того, чтобы иметь возможность изменять переданные параметры не только внутри функции но и чтобы эти изменения оставались после вызова этой функции ввели оператор inout. При вызове функции у аргумента помеченного как inout необходимо указывать знак амперсанда &

Так же ввели variadic parameters — параметры с переменным числом возможных значений, определяются как тип с троеточием

Ну и напоследок стоит заметить, что любая функция имеет тип функции — то что определяет типы ее параметров (с учетом модификаторов) без учета имен плюс тип возвращаемого значения.
Функция change к примеру имеет тип (inout Int) -> ()
() — означает пустой кортеж, функция ничего не возвращает
Соответственно тип функции можно присваивать переменным

Этот код с ошибкой, т.к. при определении типа переменной — не учтен модификатор inout

Этот же код корректен

Так же можно передавать в функции в качестве параметра переменные с типом — тип функции

Возвращать из функций

Nested functions (Вложенные функции)
Внутри функций так же можно определять функции

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *