Что такое функция в Swift?

Ответ

Функция в Swift — это самодостаточный блок кода, выполняющий конкретную задачу. Она объявляется ключевым словом func, может принимать входные параметры, выполнять операции и возвращать результат.

Базовый синтаксис:

func имяФункции(параметр1: Тип, параметр2: Тип) -> ВозвращаемыйТип {
    // Тело функции
    return значение
}

Расширенный пример с ключевыми возможностями Swift:

// Функция с внешним/внутренним именами, значением по умолчанию и меткой опускания
func calculateArea(for width: Double, and height: Double = 10.0) -> Double {
    return width * height
}

let area1 = calculateArea(for: 5.0, and: 8.0) // 40.0
let area2 = calculateArea(for: 5.0)           // 50.0 (height = 10.0 по умолчанию)

// Функция, возвращающая кортеж (множество значений)
func minMax(of array: [Int]) -> (min: Int, max: Int)? {
    guard !array.isEmpty else { return nil }
    return (array.min()!, array.max()!)
}

// Функция как объект первого класса (first-class citizen)
let operation: (Double, Double) -> Double = calculateArea
let result = operation(3.0, 4.0) // 12.0

Важные особенности функций в Swift:

  • Параметры: Могут иметь как внутренние (для использования в теле), так и внешние (для вызова) имена. Используется _ для опускания внешнего имени.
  • Возвращаемое значение: Может отсутствовать (-> Void), быть одним значением, кортежем или опциональным типом.
  • Функции как типы: Функции можно присваивать переменным, передавать как аргументы в другие функции (колбеки) и возвращать из функций (замыкания высшего порядка).
  • Способы передачи параметров:
    • inout — для сквозных параметров, изменяющих переданную переменную.
    • По умолчанию — все параметры являются константами (let). Для изменения создается локальная копия.

Ответ 18+ 🔞

А, функции в Swift? Ну, это ж как инструкция для компуктера, только на человеческом почти языке. Представь, что ты командир, а функция — это твой самый дисциплинированный солдат, который по первому зову «Иди сюда, сука!» выполняет задачу и либо молча делает своё дело, либо докладывает результат.

Вот смотри, как это выглядит, этот самый базовый устав:

func имяФункции(параметр1: Тип, параметр2: Тип) -> ВозвращаемыйТип {
    // Тело функции
    return значение
}

Видишь func? Это как кличка для пса. Крикнул — он уже тут. А дальше начинается магия, потому что свифт — он хитрожопый, он любит, чтобы всё было красиво и понятно.

Вот тебе пример посерьёзнее, чтобы прочувствовать весь этот ёперный театр:

// Функция с внешним/внутренним именами, значением по умолчанию и меткой опускания
func calculateArea(for width: Double, and height: Double = 10.0) -> Double {
    return width * height
}

let area1 = calculateArea(for: 5.0, and: 8.0) // 40.0
let area2 = calculateArea(for: 5.0)           // 50.0 (height = 10.0 по умолчанию)

Смотри, какая красота! Когда вызываешь, пишешь for width и and height — это как будто вежливо разговариваешь с кодом: «Рассчитай-ка площадь ДЛЯ ширины 5.0 И высоты 8.0». А если высоту не указал — он сам подставляет дефолтную, 10.0. Удобно, блядь! Не нужно каждый раз городить овердохуищу параметров.

А вот это вообще пиздец как круто — функция может вернуть тебе сразу два значения, завернутые в один кортеж, как котлеты в лаваш:

// Функция, возвращающая кортеж (множество значений)
func minMax(of array: [Int]) -> (min: Int, max: Int)? {
    guard !array.isEmpty else { return nil }
    return (array.min()!, array.max()!)
}

Спрашивается: «Эй, функция, найди мне минимум и максимум В ЭТОМ массиве». А она тебе: «На, мудак, держи оба значения разом, и ещё на случай пустого массива опциональку подсуну, чтобы не вылетело». Хитро, да?

Но самый сок в том, что функции в Swift — это объекты первого класса, или, как я это называю, «полноправные граждане кода». Их можно, как переменные, тыкать куда угодно:

// Функция как объект первого класса (first-class citizen)
let operation: (Double, Double) -> Double = calculateArea
let result = operation(3.0, 4.0) // 12.0

Вот это даёшь, operation — это теперь не просто слово, а полноценная ссылка на ту самую calculateArea. Прикол? Прикол. Можно передавать эту штуку в другие функции (это колбеки, ёпта) или вообще получать функции как результат (замыкания высшего порядка, мать их). Голова кругом, но это мощно.

Короче, запомни главное:

  • Параметры — можно называть их для внешнего мира и для внутреннего пользования по-разному. Поставил _ — и внешнее имя вообще хуй с горы, вызывай сразу по значению.
  • Возврат — может быть чем угодно: пустотой (Void), одним значением, парой значений или даже опциональным «а есть ли что-то вообще?».
  • Функции как типы — это не просто команды, это полноценные сущности, которые можно пинать по коду туда-сюда. Гибкость — пиздец!
  • Передача параметров — по умолчанию они все let, константы. Хочешь изменить исходную переменную? Вешай на неё бирку inout и прогоняй через функцию, как через мясорубку. Но осторожно, а то сам себя ебнешь.

Вот и вся наука. Сначала кажется, что нихуя не понятно, а потом врубаешься и такой: «Да бля, так это же удобно!». Главное — начать использовать, а там и привыкнешь.