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 не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.