---
slideOptions:
transition: slide
---
# 3.2 Кортежи и множества. Циклы for, while, repeat-while. Continue & break
---
# План занятия
1. Что такое множества и для чего их используют
2. Кортежи и все, что с ними связано
3. Цикл for
4. Цикл while
5. Цикл repeat- while
6. Break и continue
---
# Вспоминаем прошлое занятие
1. Что такое массив?
2. В чем разница между массивом, словарем и множеством?
3. Для чего используется цикл for- in?
---
# Множества (Set)
Синтаксис
[значение_1, значение_2, …, значение_N]
Множества представляют собой неупорядоченные коллекции уникальных элементов. В отличие от массивов в множествах элементы должны быть уникальными, мы не можем определить несколько элементов с одним и тем же значением.
---
## Объявление множества
Для определения множества у переменной или константы устанавливается тип Set<Element>, где Element - это тип данных:
```
var numbers: Set<Int> = [5, 6, 7, 8]
```
При определении можно опускать тип:
```
var numbers: Set = [5, 6, 7, 8]
```
Либо можно использовать функцию инициализатора Set<Element>:
```
var numbers = Set<Int>(arrayLiteral: 5, 6, 7, 8)
```
Создание пустого множества:
```
var numbers = Set<Int>()
// или
// var numbers: Set<Int> = []
```
---
# Операции над множествами
## Добавление и удаление элементов из множествами
**Метод insert()** позволяет добавить новый элемент в множество:
```
var numbers: Set<Int> = [5, 6, 7, 8]
numbers.insert(9)
print(numbers) // [5, 6, 7, 8, 9]
```
Например, добавления еще одного человека в уже существующее множество людей для отображения в таблице.
Также множества поддерживают **ряд операций по удалению:**
`removeAtIndex()` : удаляет элемент по определенному индексу
`removeFirst()` : удаляет первый элемент
`remove()` : удаляет какой-то определенный элемент по значению
`removeAll()` : удаляет все элементы
```
numbers.remove(6)
print(numbers) // [5, 7, 8, 9]
```
---
## Поиск элемента и сортировка
Еще один **метод `contains()`** позволяет проверить наличие в множестве элемента:
```
var numbers: Set<Int> = [5, 6, 7, 8]
var isPresent = numbers.contains(6) // true - элемент есть
isPresent = numbers.contains(34) // false - элемент отсутствует
```
Contains() будет полезен при поиске человека в таблице, если нужно определить есть ли вообще такой
Хотя множество представляет неупорядоченный набор с помощью **метода sorted()** мы можем отсортировать его:
```
var numbers: Set<Int> = [6, 4, 0, 9]
numbers.sorted()
print(numbers) // [0, 4, 6, 9]
```
Можете использовать этот метод, когда вам нужно отсортировать пользователей, например, по возрасту.
---
## Объединение, пересечение, разность множеств
Особую ценность среди операций представляют операции, предназначенные специально для множеств: объединение, пересечение, разность множеств.
Эти операции помогут вам обойтись без лишнего кода и увеличить скорость работы программы.

---
## Объединение, пересечение, разность множеств
**intersection()**: пересечение множеств, возвращает общие для обоих множеств элементы;
**symmetricDifference()**: возвращает не общие (не пересекающиеся) для обоих множеств элементы (симметрическая разность);
**union()**: объединение двух множеств;
**subtract()**: разница множеств, возвращает элементы первого множества, которые отсутствуют во втором.
```
var a: Set = [1, 2, 3, 4, 5]
var b: Set = [4, 5, 6, 7, 8]
// объединение
a.union(b) // [1, 2, 3, 4, 5, 6, 7, 8]
// пересечение
a.intersection(b) // [4, 5]
// разность
a.subtract(b) // [1, 2, 3]
// симметрическая разность
a.symmetricDifference(b) // [1, 2, 3, 6, 7, 8]
```
---
# Кортеж (Tuple)
## Что такое кортеж?
```
Кортеж - это набор значений (значение_1, значение_2, …)
```
В основном, кортежи используются, когда требуется создать объект, который будет хранить данные с различными типами. Например, информацию о человеке: имя, возраст и отметку мужчина ли это.
```
let info = (name: "Никита", age: 24, isMale: true)
```
---
## Определение кортежа
Кортеж — это особый объект, который группирует значения различных типов в пределах одного составного значения. Более того, кортеж предлагает наиболее простой способ объединения значений различных типов в пределах одного значения.
У каждого отдельного значения в составе кортежа может быть собственный тип данных, который никак не зависит от других.
```
let имяКонстанты = (значение_1, значение_2, ...)
var имяПеременной = (значение_1, значение_2, ...)
```
#### Возможно явное определение типов
```
let myProgramStatus: (Int, String, Bool) = (200, «In Work», true)
```
#### Или неявное
```
let myProgramStatus = (200, «In Work», true)
```
---
## Присваивание
**Поэлементное** (каждое значение присваивается отдельно) **присваивание**
```
let myProgramStatus = (200, «In Work», true)
let statusCode = myProgramStatus.0
let descrption = myProgramStatus.1
let inProgress = myProgramStatus.2
```
Или **комплексное** (все значения присваиваются в одной строке)
```
let (statusCode, descrption, inProgress) = (200, «In Work», true)
```
---
## Изменение значений
Иногда приходится изменять у кортежа отдельный элемент:
```
var myProgramStatus = (200, «In Work», true)
myProgramStatus.2 = false
let inProgress = myProgramStatus.2 // false
```
Это работает только тогда, когда кортеж объявлен как переменная (var).
---
## Альтернатива определения кортежа
При определении кортежа можно отдельно именовать его элементы:
```
var myProgramStatus = (statusCode: 200, description: «In Work», inProgress: true)
let statusCode = myProgramStatus.statusCode
let inProgress = myProgramStatus.inProgress
```
Указанные имена элементов кортежа можно использовать при получении значений этих элементов. При этом применяется тот же синтаксис, что и при доступе через индексы.
Присвоение имен значениям не лишает вас возможности использовать индексы. Индексы в кортеже можно задействовать всегда.
---
# Циклы
---
## Циклы
Цикличное выполнение кода обеспечивается операторами повторения.
Swift предлагает всего три таких оператора: **for, while и repeat while**.
Каждый из них имеет разные возможности.
Код может повторяться либо до выполнения какого-то условия, либо определенное количество раз. Каждое следующее выполнение блока кода называется **итерацией**.
----
## Цикл for-in
С помощью **цикла for-in** мы можем перебрать элементы коллекции (массивы, множества, словари) или последовательности. Он имеет следующую форму:
```
for объект_последовательности in последовательность {
// действия
}
```
Например, переберем элементы массива:
```
for item in 1…5 {
print(item)
}
```
Выражение 1…5 образует последовательность из пяти чисел от 1 до 5, и цикл проходит по всем элементам последовательности.
При каждом проходе он извлекает одно число и передает его в переменную item. Таким образом, цикл сработает пять раз.
---
## Цикл for-in with where
С помощью **оператора where** можно задавать условия выборки из последовательности элементов:
```
for i in 0…10 where i % 2 == 0 {
print(i)
}
```
Здесь из последовательности 0…10 извлекаются только те элементы, которые соответствуют условию после оператора where — `i % 2 == 0`, то есть четные числа.
---
## Цикл while
**Оператор while** проверяет некоторое условие, и если оно возвращает true, то выполняет блок кода.

Этот цикл имеет следующую форму:
```
while условие {
// действия
}
```
Например:
```
var i = 10
while i > 10 {
print(i)
i -= 1
}
```
При этом надо внимательно подходить к условию. Если оно всегда будет возвращать true, то мы получим бесконечный цикл, и приложение может зависнуть.
---
## Цикл repeat- while
**Цикл repeat-while** сначала выполняет один раз цикл, и если некоторое условие возвращает true, то продолжает выполнение цикла. Он имеет следующую форму:
```
repeat {
// действие
} while условие
```
Например, перепишем предыдущий цикл while:
```
var i = 10
repeat {
print(i)
i -= 1
} while i > 10
```
Здесь цикл также выполнится 10 раз, пока значение переменной i не станет равно 0.
---
# Оператор break
Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его завершения. В этом случае мы можем воспользоваться оператором break.
Например, когда вам нужно добавить в массив только один элемент с определенным значением и когда такой элемент будет найдет, следует использовать break.
```
for i in 0…10 {
if i == 5 {
break
}
print(i) // 0, 1, 2, 3, 4
}
```
Поскольку в цикле идет проверка, равно ли значение переменной i числу 5, то когда перебор дойдет до числа 5, сработает оператор break, и цикл завершится.
---
# Оператор continue
Теперь поставим себе другую задачу. А что если мы хотим, чтобы при проверке цикл не завершался, а просто переходил к следующему элементу.
Для этого мы можем воспользоваться оператором **continue**.
Оператор continue используйте в противоположных случаях: если вам нужно пропустить элемент с определенным значением, но не выходить из цикла.
```
for i in 0…10 {
if i == 5 {
continue
}
print(i) // 0, 1, 2, 3, 4, 6, 7, 8, 9, 10
}
```
В этом случае цикл, когда дойдет до числа 5, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующему элементу последовательности.
---
# Итоги занятия
1. Зачем нужно множество? Где бы вы применили Set?
2. Что такое кортеж и для чего бы вы его использовали?
3. Зачем нужен цикл for?
4. В чем отличие while от for?
5. Что отличает repeat-while от while?
6. Когда бы вы использовали break, а когда continue?
---
## Дополнительные ссылки
Для саморазвития можно почитать еще на сайте [swiftbook](https://swiftbook.ru/content/languageguide/collection-types/)
Вот [здесь](https://swiftbook.ru/content/language-reference/types/) рассказывается про кортежи
А про циклы вот по этой [ссылке](https://swiftbook.ru/content/languageguide/control-flow/)
Это перевод основной документации по swift от Apple, но если хотите прокачать уровень английского и почитать в оригинале, то вот [ссылка](https://docs.swift.org/swift-book/)
---
# Домашнее задание
...