Привет. В этой лекции мы рассмотрим, что такое функции, что такое методы и чем они отличаются друг от друга. Для того, чтобы объявить функцию, нужно использовать ключевое слово func. В скобках после названия — список параметров, после стрелки указывается возвращаемый тип; если он void, то его можно опустить, значение по умолчанию указывается после знака равно. При этом не обязательно, чтобы такой параметр был в конце; возврат нескольких объектов с функцией можно реализовать через кортежи. Рассмотрим конкретный пример функции. Она принимает три параметра; для одного из них имеет значение по умолчанию и возвращает кортеж с двумя значениями. Для вызова функции нужно указать аргументы для всех параметров, не имеющих значение по умолчанию; при этом порядок объектов должен сохраняться. Для того чтобы проигнорировать возвращаемое значение, его нужно присвоить нижнему подчёркиванию. Также можно использовать при объявлении функции атрибут discardableResult. Тогда выполнение данной функции можно не присваивать ничему. [БЕЗ_СЛОВ] Ещё в Swift есть такое понятие как имя аргумента и имя параметра. В предыдущем примере они совпадали, но можно сделать их разными или вообще убрать имя аргумента. А внутри же функции мы используем имя параметра. [БЕЗ_СЛОВ] В данной функции у первого аргумента нет имени, но есть имя параметра; второй же аргумент имеет как имя аргумента, так и имя параметра, которое мы будем использовать уже внутри функции. При вызове указываем имя аргумента или просто значение, если имя аргумента не используется. Используя такой подход, убедитесь, что код остаётся понятным и читаемым. Также в Swift можно использовать функции с переменным числом параметров. [БЕЗ_СЛОВ] Для этого после типа нужно поставить три точки. Внутри функции эти параметры будут доступны как массив. Очевидно, что в функции может быть только один такой параметр. При этом не обязательно, чтобы этот параметр был последним. Аналогично передаче параметра посылке в C++ в Swift мы тоже имеем возможность изменять аргументы внутри функции. Для этого нужно пометить его ключевым словом inout. [БЕЗ_СЛОВ] При вызове аргументы передаются через амперсанд; нельзя передавать таким образом константу или литерал. Inout-параметры не могут иметь значений по умолчанию или быть параметрами с переменным числом аргументов. Функции Swift являются функциями высшего порядка: они имеют свой тип и, как и другие типы данных, могут храниться в переменных и быть переданы в другие функции. [БЕЗ_СЛОВ] Несмотря на разные названия, обе функции summation и multiplication имеют одинаковый тип. Они принимают два параметра типа integer и возвращают один integer. Переменная для хранения функций должна иметь такой же тип. Указывать его в данном случае не обязательно, это сделано для наглядности. Для вызова функции из переменной пишем название переменной и в скобке — необходимые параметры. Для того, чтобы передать функцию, нужно указать её тип, как и любой другой. Обратите внимание, что squareTransformator объявлена внутри другой функции. В предыдущих примерах функции были объявлены в глобальной области видимости, поэтому их называют глобальными. squareTransformator является вложенной функцией. Такие функции доступны только в своей области видимости, но их всё равно можно передать во внешний Skulpt. Для того, чтобы передать функцию, нужно просто указать её название без круглых скобок; их мы используем в момент вызова. Обратите внимание, что имена аргументов уже не указываются при вызове функции. [БЕЗ_СЛОВ] Методы — это функции, ассоциируемые с каким-либо типом. В Swift методы могут быть у классов, структур и перечислений. Синтаксис объявления метода аналогичен объявлению функции. Внутри метода имеется свойство self; через него можно обратиться к самому объекту, у которого вызван данный метод. Однако в большинстве случаев Swift сам понимает, что вы имеете в виду, и self можно опустить. Он может понадобиться, например, если имя свойства у объекта и имя параметра совпадают. Например, в данном примере нам необходимо чётко разграничить, обращаемся ли мы к своему свойству count или же к параметру. В методе инкремент self можно и не указывать. По умолчанию методы значимых типов не могут модифицировать свой объект; чтобы дать им такую возможность, нужно добавить ключевое слово mutating перед объявлением метода. Более того, вы можете присвоить в self новый объект, и он заменит собой предыдущий в содержащей его переменной. Данная структура в методе reset переприсваивает себе же нулевой point. Для добавления методов самому типу нужно использовать ключевое слово static. Однако в Swift есть небольшая особенность: статические методы нельзя переопределять в subclass'е. Чтобы показать, что необходимо использовать динамическую диспетчеризацию, нужно вместо ключевого слова static указать слово class. Внутри классовых методов self указывает на сам тип. Это даёт доступ к классовым свойствам и методам, но, как и с обычными методами, для доступа self указывать не обязательно. Не обращайтесь из одного классового метода к другому через имя класса; если вы переопределите такой метод в дочернем классе, то вызовется всё равно родительский, так как явно указан тип. Это можно проследить на следующем примере. Функцией printer1 вызывается метод через self, поэтому если он переопределён в классе MySubClass, именно он и будет вызван. Если же мы обращаемся через имя класса, то будет вызвана реализация из того самого класса. К методам типа можно обратиться и из экземпляра класса или структуры; для этого нужно использовать функцию typeof. Она возвращает тип переданного экземпляра. Обращаться к ним по имени класса не стоит (так же из-за наследования). [БЕЗ_СЛОВ] На этом лекция по функциям и методам закончена. Мы разобрались, как объявлять функции и методы и какие у них есть особенности в Swift.