Основи Swift. Функції

Основи Swift. Функції

Функції — це самостійні фрагменти коду, які вирішують певне завдання. Кожній функції присвоюється унікальне ім’я, за яким її можна ідентифікувати і «викликати» в потрібний момент. Сьогодні ми навчимося створювати функції у Swift.

Написання функцій

Давайте почнемо з простої функції:

func favoriteAlbum() {
    print("My favourite is Fearless")
}

Якщо додати цей код у playground, в області результатів нічого не буде надруковано. Це пояснюється тим, що для запуску даного коду в роботу необхідно його викликати, вказавши ім’я функції favoriteAlbum(), яка викликається. У Swift це робиться наступним чином:

favoriteAlbum()

Тепер наш код роздрукує «My favourite is Fearless».

Щоб створити нову функцію, потрібно ввести службове слово func, а потім назву, після якої в дужках вказуються вхідні параметри. Тіло функції розташовується усередині фігурних дужок. Виклик функції здійснюється за її іменем з подальшою вказівкою пустих круглих дужок.

Звичайно, ми розглянули найпростіший приклад використання функції. Давайте ускладнимо нашу задачу і спробуємо вказати назву альбому, ім’я якого ми опрацюємо вже всередині функції і виведемо його на екран:

func favoriteAlbum(album: String) {
    print("My favourite is \(album)")
}

Тепер наша функція приймає одне значення, так званий «параметр» з ім’ям «album» і строковим типом. Потім всередині блоку коду функції, використовуючи метод інтерполяції рядків, ми друкуємо наше кінцеве повідомлення.

Навіщо потрібні функції

Використання функцій полегшує подальшу підтримку коду. Наприклад, може виникнути робоча ситуація, коли дизайнер проекту вносить пропозицію змінити текст повідомлення на «I love Fearless so much — it’s my favorite!». Враховуючи, що цей текст застосовується в двадцяти різних місцях програми, внести таку правку вручну буде проблематично і затратно по часу. Проте, застосувавши один раз функцію, вирішити поставлене завдання стає простіше — потрібно всього лише поміняти текст повідомлення всередині тіла нашої функції і всі двадцять оновлень здійсняться автоматично!

В наших силах створювати функції, які будуть приймати стільки параметрів, скільки буде потрібно. Крім цього, враховуючи той факт, що ми вивчаємо Swift 2, при роботі з функціями з’явилася можливість задавати імена вхідних параметрів, наприклад:

func printAlbumRelease(name: String, year: Int) {
    print("\(name) was released in \(year)")
}
 
printAlbumRelease("Fearless", year: 2008)
printAlbumRelease("Speak Now", year: 2010)
printAlbumRelease("Red", year: 2012)

Зверніть увагу, що за старою доброю традицією компанії Apple імена функцій повинні бути сформовані таким чином, щоб ім’я першого параметра «випливало» із загальної назви функції. Тому, Swift буде викликати цю функцію як printReleaseDateOfAlbumNamed(), а розробник побачить код, який повідомить йому про те, що: «release date of album named Fearless, year 2008».

Значення, що повертаються

Функції можуть повертати значення. Для цього при їх створенні необхідно ввести символ «–>», після якого вказати тип даних, що повертається.

Наприклад, давайте напишемо функцію, яка повертає значення true, якщо автором альбому є Тейлор Свіфт або false в іншому випадку. Вхідним параметром буде виступати назва альбому:

func albumsIsTaylor(name: String) –> Bool {
    if name == "Taylor Swift" { return true }
    if name == "Fearless" { return true }
    if name == "Speak Now" { return true }
    if name == "Red" { return true }
    if name == "1989" { return true }
 
    return false
}
 

Тепер давайте викличемо на виконання нашу функцію, вказавши назву альбому. Залежно від значення, що повертається, виконаємо друк повідомлення в області результатів:

if albumsIsTaylor("Red") {
    print("That's one of hers!")
} else {
    print("Who made that?!")
}
 
if albumsIsTaylor("Blue") {
    print("That's one of hers!")
} else {
    print("Who made that?!")
}

Функціональний тип

Цікавою особливістю Swift є використання функціонального типу. Наприклад, давайте створимо дві нові функції:

func addTwoInts(a: Int, b: Int) -> Int {
		return a + b
}
 
func multiplyTwoInts(a: Int, b: Int) -> Int {
		return a * b
}

Обидві функції мають тип (Int, Int) -> Int. Цей запис означає наступне: «функція має два вхідних параметра з типом Int і повертає вихідне значення типу Int».

В Swift з функціональними типами можна працювати так само, як і з іншими типами. Можна оголосити константу або змінну функціонального типу та присвоїти їй функцію відповідного типу:

var mathFunction: (Int, Int) -> Int = addTwoInts

Цей запис означає наступне: «Оголосити змінну mathFunction з типом “функція”, яка приймає два значення типу Int і повертає одне значення типу Int. Присвоїти цій новій змінній вказівник на функцію addTwoInts».

Функція addTwoInts має той же тип, що і змінна mathFunction, тому з точки зору мови Swift таке присвоювання коректне.

Тепер функцію можна викликати за допомогою змінної mathFunction:

print("Result: \(mathFunction(2, 3))")

Також нашій змінній можна присвоїти іншу функцію такого ж типу — аналогічно випадкам роботи зі звичайними нефункціональними типами:

mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))")

Як і для будь-якого іншого типу, під час ініціалізації константи або змінної тип функції перевіряється автоматично. Саме тому можливий скорочений запис створення нової константи:

let anotherMathFunction = addTwoInts

Наш функціональний тип зразка (Int, Int) -> Int може бути застосованим у якості типа одного з вхідних параметрів іншої функції. Це дозволяє визначати деякі аспекти реалізації функції безпосередньо під час її виклику.

Наступний код друкує на екрані результати роботи наведених вище математичних функцій:

func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
print("Result: \(mathFunction(a, b))")
}
 
printMathResult(addTwoInts, 3, 5)

У цьому прикладі оголошена нова функція printMathResult, у якої є три параметра. Перший параметр під назвою mathFunction має тип (Int, Int) -> Int. Відповідно, аргументом цієї функції може бути будь-яка функція такого ж типу. Другий та третій параметри називаються a і b і належать до типу Int. Вони слугують для передачі двох вхідних значень для математичної функції.

Крім цього, функціональний тип може виступати як тип вихідного результату іншої функції. Для цього потрібно записати повний функціональний тип одразу ж після результуючої стрілки «->» основної функції.

Сьогодні ми навчилися писати функції у Swift і працювати з функціональним типом. До наступних публікацій!

Джерело: Hacking with Swift

Потрібен MVP, розробка під iOS, Android або прототип додатка? Ознайомтеся з нашим портфоліо і зробіть замовлення вже сьогодні!