Update 06.Функции высшего порядка.md
Синтаксис + корректура
This commit is contained in:
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`. Давайте разбираться?
|
||||
|
||||
КНОПКА
|
||||
Да! Перейдём к замыканиям
|
||||
|
||||
Reference in New Issue
Block a user