Ознакомившись с переменными, настало время научиться писать свои методы и функции в Swift. Для этого откроем наш плейграунд, в котором мы работали в предыдущем уроки, и приступим.
По-традиции, на мгновение окунёмся в теорию и посмотрим как Wikipedia описывает методы и функции:
Фу́нкция — фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. В большинстве случаев с функцией связывается идентификатор, но многие языки допускают и безымянные функции.
Ме́тод — это функция или процедура, принадлежащая какому-то классу или объекту.
По сути, методы и функции — это одно и тоже. Разница заключается лишь в том, к какому объекту они принадлежат и где были объявлены.
Функции
Для объявления функции используется оператор func. Шаблон создания функции выглядит следующим образом:

Объявление функции в Swift
На примере кода, функция выглядит следующим образом:
|
1 2 3 |
func sayHello(name: String) -> Void { print("Hello, \(name)") } |
Здесь мы объявили функцию под именем sayHello, которая принимает в качестве аргумента (параметра) строковую переменную name и ничего не возвращает в ответ (Void). В теле функции мы использовали уже знакомую нам функцию print. Попробуем использовать то что мы написали, добавив следующий код:
|
1 |
sayHello("Start iOS") |
Вот так всё просто — достаточно сослаться на имя функции и указать необходимые параметры.
Ранее мы уже использовали функции и методы в наших уроках, просто не акцентировали внимание на них.
Если Вам нужно получить что-либо в результате работы функции в Swift, достаточно заменить return type с Void на необходимый класс. Рассмотрим следующий пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Создаём 3 переменных let a: Float = 22.5 let b: Float = 30 var c: Float = 0 // Объявляем функцию, которая принимает 2 параметра типа Float, // суммирует их и возвращает результат func sum(a: Float, b: Float) -> Float { return a + b } // Задаём переменной "с" значение суммы переменных "a" и "b" c = sum(a, b: b) |
В качестве возвращаемого аргумента можно использовать абсолютно любой тип данных: числовые и строковые переменные, классы и др.
В качестве эксперимента самостоятельно напишите еще 3 функции: вычитание, деление и умножение.
Естественно, что далеко не все функции в Swift являются столь простыми. Поэтому мы можем создавать любое количество переменных внутри тела функции, а также вызывать любое количество других функций из тела первой.
Рассмотрим более сложный пример — создадим 2 функции. Одна будет печатать переданное ей значение в лог, а с помощью второй мы будем рассчитывать площадь круга по формуле «S = π * r2«. При этом, мы создадим переменную внутри второй функции и будем вызывать первую функцию при необходимости:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/* Функция, которая просто печатает значение переменной */ func printValue(value: Float) { print("Value = \(value)") } /* Функция "calculateCircleSquare" для расчета площади круга по формуле "S = π * r2" Параметры: radius - радиус нашего круга. printResult - булева переменная, с помощью которой мы говорим функции печатать промежуточный результат или нет. Результат: площадь круга */ func calculateCircleSquare(radius: Float, printResult: Bool) -> Float { // Создаём переменную внутри фнукции // Она будет использоваться в качестве возвращаемого аргумента var square: Float = 0 // Расчитываем площадь круга. // Здесь мы используем: // 1. Gеременную "pi", которую мы объявляли в уроке "Переменные в Swift" // 2. аргумент функции "radius", а также стандартную функцию "pow(lhs: Float, _ rhs: Float)" для возведения в степень. square = Float(pi) * pow(radius, 2) // Проверяем значение булевой переменный if printResult { // Если равна true - печатаем в лог значение площади // вызвав ранее созданную функцию "printValue" printValue(square) } // Возвращаем результат return square } // Объявляем переменную с радиусом, а также - две переменные, которые принимают значение результата функции "calculateCircleSquare" let radius: Float = 22 let squareWithPrint = calculateCircleSquare(radius, printResult: true) let square = calculateCircleSquare(radius, printResult: false) |
Внимание! У каждой переменной имеется своя область видимости. К примеру, Вы не сможете манипулировать переменной square вне функции calculateCircleSquare, так как она объявлена внутри её тела и может быть доступна только оттуда.
Функции — тип первого класса. Это означает, что функция может возвращать другую функцию в качестве значения. Посмотрите пример из книги Apple:
|
1 2 3 4 5 6 7 8 9 10 |
func makeIncrementer() -> ((Int) -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne } var increment = makeIncrementer() increment(7) // Excerpt From: Apple Inc. “The Swift Programming Language (Swift 2.2).” iBooks. https://itun.es/ua/jEUH0.l |
Как мы можем здесь видеть, внутри функции makeIncrementer объявляется новая — addOne, которая и возвращается в качестве значения. Тем самым переменная increment по-умолчанию стала функцией. Соответсвенно, если Вы захотите передать какой-нибудь аргумент в makeIncrementer, то сможете без проблем использовать его внутри addOne.
Мы осмотрели основные возможности как создаются и используются функции в Swift и теперь готовы двигаться дальше. Для того чтобы укрепить знания, мы советуем Вам написать самостоятельно несколько функций различных сложностей самостоятельно.
Подписывайтесь на обновления, следите за новыми уроками!