diff --git a/lessons/05.Sprint/01.Память/06.Функции высшего порядка.md b/lessons/05.Sprint/01.Память/06.Функции высшего порядка.md index 2c22cc63..10eb7d12 100644 --- a/lessons/05.Sprint/01.Память/06.Функции высшего порядка.md +++ b/lessons/05.Sprint/01.Память/06.Функции высшего порядка.md @@ -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`. Давайте разбираться? -КНОПКА -Да! Перейдём к замыканиям