Update 06.Функции высшего порядка.md

Синтаксис + корректура
This commit is contained in:
Gennadiy Gryaznov
2025-08-04 15:00:24 +03:00
committed by GitHub
parent 40aa8021c3
commit 472beeeca8
@@ -3,7 +3,13 @@
## Введение
В этом уроке вы познакомитесь с функциями высшего порядка, узнаете, для чего они нужны и как записать функцию в переменную.
Функции высшего порядка помогают эффективнее работать с данными, реализовывать сложные логические цепочки и откладывать во времени получение ответа при вызове другой функции. Знания о функциях высшего порядка пригодятся вам при разработке итогового проекта, например, для обработки данных получаемых из сети, настройки пользовательского интерфейса и реализации асинхронных операций. Подобные функции iOS-разработчики и разработчицы используют очень часто, в том числе потому что Apple использует их в своих фреймворках. Освоив их, вы сможете писать более гибкий, масштабируемый и читаемый код.
Функции высшего порядка помогают:
- эффективнее работать с данными;
- реализовывать сложные логические цепочки;
- и откладывать во времени получение ответа при вызове другой функции.
Знания о функциях высшего порядка пригодятся вам при разработке итогового проекта, например, для обработки данных, получаемых из сети, настройки пользовательского интерфейса и реализации асинхронных операций. Подобные функции применяют очень часто, в том числе, потому что Apple использует их в своих фреймворках. Освоив их, вы сможете писать более гибкий, масштабируемый и читаемый код.
> Вы увидите примеры кода — рекомендуем вставлять их в плейграунд и экспериментировать. Так вы лучше усвоите материал курса, поймёте, почему мы приводим именно такие решения и сами продумаете, как решать задачи.
@@ -42,7 +48,7 @@ let printFunc = printDescription(description:)
КНОПКА
И это работает?
Да! Следующий логичный вопрос если в переменной есть функция, можно ли её вызвать? Да, можно.
Да! Следующий логичный вопрос: если в переменной есть функция, можно ли её вызвать? Да, можно.
```swift
func printDescription(description: String) { // функция печати в консоль
@@ -95,15 +101,11 @@ let someFunc = plus // присваиваем функцию plus перемен
В разделе выше вы выяснили: в переменную можно записать функцию. Получается, можно и передать в одну функцию другую в качестве аргумента.
ДИАЛОГ
**КНОПКА-ДИАЛОГ**
СТУДЕНТ: Как это будет выглядеть?
ПРАКТИКУМ: Сейчас покажем на примере.
Студент
Как это будет выглядеть?
Практикум
Сейчас покажем на примере.
Допустим, у нас есть функция, которая складывает два числа и должна произвести операцию с результатом. Мы можем передать в неё другую функцию, которая будет выполнять операцию с результатом сложения. Например, мы можем передать функцию, которая будет сохранять результат на устройстве, а в другой раз можем передать функцию отправляющую его по электронной почте:
Допустим, у нас есть функция, которая складывает два числа, и должна произвести операцию с результатом. Мы можем передать в неё другую функцию, которая будет выполнять операцию с результатом сложения. Например, мы можем передать функцию, которая будет сохранять результат на устройстве, а в другой раз можем передать функцию, отправляющую его по электронной почте:
```swift
@@ -129,23 +131,21 @@ addAndApply(number1: 1, number2: 2, operation: saveOnDeviceFunc) // переда
addAndApply(number1: 1, number2: 2, operation: sendEmailFunc) // передаём переменную sendEmailFunc как аргумент в функцию
```
ДИАЛОГ
Студент
А что такое `(String) -> Void`?
Практикум
Это тип функции. Запись указывает на то, что как аргумент может быть принята функция:
**КНОПКА-ДИАЛОГ**
СТУДЕНТ: А что такое `(String) -> Void`?
ПРАКТИКУМ: Это тип функции. Запись указывает на то, что как аргумент может быть принята некоторая функция.
Например, та:
- у которой есть один параметр типа `String` (он указывается в скобках, как и параметр обычной функции);
- которая ничего не возвращает (`Void` означает пустоту — это самое «ничего»).
Если бы функция не принимала ничего и ничего не возвращала, то её тип был бы `() -> Void`.
Или если бы принимала один параметр типа `Int` и возвращала число, её тип был бы `(Int) -> Int`.
Или если бы принимала ничего и возвращала число, её тип был бы `() -> Int`.
Если бы функция принимала два числа типа `Float` и тоже возвращала число, её тип был бы `(Float, Float) -> Float`.
Таким образом:
- Если бы функция не принимала ничего и ничего не возвращала, то её тип был бы `() -> Void`.
- Или если бы принимала один параметр типа `Int` и возвращала число, её тип был бы `(Int) -> Int`.
- Или если бы принимала ничего и возвращала число, её тип был бы `() -> Int`.
- Если бы функция принимала два числа типа `Float` и тоже возвращала число, её тип был бы `(Float, Float) -> Float`.
> Функции принимающие другие функции в качестве аргументов, либо возвращающие функцию как результат, либо и то и другое, называют функциями высшего порядка.
> Функции, принимающие другие функции в качестве аргументов, либо возвращающие функцию как результат, либо и то и другое, называют функциями высшего порядка.
## Самостоятельная задача
@@ -164,7 +164,6 @@ output(nums, condition: isEven)
НАЧАЛО СКРЫВАШКИ
**Авторское решение**
Советуем посмотреть авторское решение только после того, как вы сами попробовали решить задачу. С ним можно сверяться, хотя оно может отличаться от вашего решения.
```swift
@@ -216,7 +215,7 @@ func output(_ numbers: [Int], condition: (Int) -> Bool) {
Пояснение: Нет, это не функция высшего порядка. Она принимает только простой параметр `number` типа `Int` и возвращает результат типа `Bool`, но не принимает другую функцию в качестве параметра.
## Найдите функцию, которая принимает массив кораблей и функцию проверяющую условие, а также возвращает массив кораблей, которые удовлетворяют условию
## Найдите функцию, которая принимает массив кораблей и функцию, проверяющую условие, а также возвращает массив кораблей, которые удовлетворяют условию
```swift
struct Spaceship {
@@ -234,7 +233,7 @@ let spaceships = [
- [ ] func filterSpaceshipsByName(spaceships: [Spaceship], name: String) -> [Spaceship] { ... }
Пояснение: Эта функция принимает массив кораблей `spaceships` и строку `name` в качестве параметров. Она фильтрует корабли по имени, возвращает массив кораблей, у которых имя совпадает со значением `name`. Но это не функция высшего порядка — она не принимает функцию проверяющую условие в качестве параметра.
Пояснение: Эта функция принимает массив кораблей `spaceships` и строку `name` в качестве параметров. Она фильтрует корабли по имени, возвращает массив кораблей, у которых имя совпадает со значением `name`. Но это не функция высшего порядка — она не принимает функцию, проверяющую условие в качестве параметра.
- [x] func filterSpaceships(spaceships: [Spaceship], condition: (Spaceship) -> Bool) -> [Spaceship] { ... }
@@ -246,11 +245,9 @@ let spaceships = [
- [ ] func sortSpaceshipsByCrewSize(spaceships: [Spaceship]) -> [Spaceship] { ... }
Пояснение: Это не функция высшего порядка. Она принимает массив кораблей `spaceships` и сортирует их по размеру экипажа, возвращает отсортированный массив. Но она не принимает функцию проверяющую условие в качестве параметра, а это один из признаков функции высшего порядка.
Пояснение: Это не функция высшего порядка. Она принимает массив кораблей `spaceships` и сортирует их по размеру экипажа, возвращает отсортированный массив. Но она не принимает функцию, проверяющую условие в качестве параметра, а это один из признаков функции высшего порядка.
КОНЕЦ КВИЗОВ
Вы посмотрели на функции и переменные под другим углом. Теперь вам проще будет понять, как работают замыкания, или `closures`. Давайте разбираться?
КНОПКА
Да! Перейдём к замыканиям