---
title: 3.2. Коллекции(кортеж и множество). Циклы for, while, repeat-while. Continue и break
tags: Templates, Talk
description: View the slide with "Slide Mode".
---
# 3.2. Коллекции: кортеж и множество. Циклы for, while, repeat-while. Continue и break
# План занятия
1. Кортеж и все что с ним связано
2. Что такое множество и для чего их используют?
3. Цикл for
4. Цикл while
5. Цикл repeat-while
6. Инструкции break и continue
---
## Вспоминаем прошлые занятия
- Что такое массив?
- Что такое словарь?
- Для чего используется цикл for-in?
---
## Введение
На прошлом занятии мы с вами уже познакомились с двумя видами коллекций это массив и словарь. Теперь на очереди кортеж и множество.
## Кортеж
Кортежи представляют набор значений, которые рассматриваются как один объект. Для создания кортежа используются скобки, внутри которых записываются все элементы кортежа:
```javascript=
let props = (22, "age")
var userInfo = (true, 34, "Tom")
```
Здесь два кортежа props и userInfo. Кортеж props содержит число 22 и строку "age", а кортеж userInfo хранит логическое значение true, число 34 и строку "Tom".
Хотя в данном случае тип данных в кортеже не указан и выводится неявно, но мы можем при определении кортежа также объявить и типы данных его значений:
```javascript=
let props: (Int, String) = (22, "age")
var userInfo: (Bool, Int, String) = (true, 34, "Tom")
```
Причем при объявлении типов кортежа его значения должны полностью соответствовать по типу.
Мы можем присвоить значения из кортежа переменным или константам. Например:
```javascript=
var userInfo: (Bool, Int, String) = (true, 34, "Tom")
let(isMarried, age, name) = userInfo
print(name) // "Tom"
```
Здесь трем константам isMarried, age и name присваиваются значения кортежа. Причем присвоение идет по позиции: константе isMarried присваивается первое значение кортежа, константе age - второе значение и так далее.
Если необходимо игнорировать при присвоении некоторые значения, то для них можно использовать знак подчеркивания _. Например, нам не нужно первое значение кортежа:
```javascript=
var userInfo: (Bool, Int, String) = (true, 34, "Tom")
let(_, age, name) = userInfo
```
Вместо присвоения всех значений кортежа переменным мы можем выполнять присвоение по отдельности:
```javascript=
var userInfo: (Bool, Int, String) = (true, 34, "Tom")
let age = userInfo.1
let isMarried = userInfo.0
var name = userInfo.2
```
Нумерация элементов кортежа начинается с нуля, поэтому к первому элементу мы сможем обратиться так: userInfo.0.
Также по отдельности мы можем изменять элементы кортежа, если кортеж определен как переменная:
```javascript=
var userInfo: (Bool, Int, String) = (true, 34, "Tom")
userInfo.2 = "Bob"
var name = userInfo.2 // Bob
```
Правда, если кортеж определен как константа, изменить его значения мы уже не сможем.
Также при определении кортежа мы можем именовать его отдельные элементы. Например:
```javascript=
var userInfo = (married: true, age: 34, name: "Tom")
let age = userInfo.age
var name = userInfo.name // Tom
```
## Множества
Множества (Set) представляют собой неупорядоченные коллекции уникальных элементов. В отличие от массивов в множествах элементы должны быть уникальными, мы не можем определить несколько элементов с одним и тем же значением.
### Определение
Для определения множества у переменной или константы устанавливается тип Set<Element>, где Element - это тип данных:
```javascript=
var numbers: Set<Int> = [5, 6, 7, 8]
```
При определении можно опускать тип:
```javascript=
var numbers: Set = [5, 6, 7, 8]
```
Либо можно использовать функцию инициализатора Set<Element>:
```javascript=
var numbers = Set<Int>(arrayLiteral: 5, 6, 7, 8)
```
Создание пустого множества:
```javascript=
var numbers = Set<Int>()
// или
// var numbers: Set<Int> = []
```
### Работа с множествами
Метод insert() позволяет добавить новый элемент в множество:
```javascript=
var numbers: Set<Int> = [5, 6, 7, 8]
numbers.insert(10);
print(numbers) // [5, 6, 7, 8, 10]
```
Также множества поддерживают ряд операций по удалению:
```
removeAtIndex(): удаляет элемент по определенному индексу
removeFirst(): удаляет первый элемент
remove(): удаляет какой-то определенный элемент по значению
removeAll(): удаляет все элементы
```
```javascript=
var numbers: Set<Int> = [5, 6, 7, 8]
numbers.remove(7);
print(numbers) // [5, 6, 8]
```
Еще один метод contains() позволяет проверить наличие в множестве элемента:
```javascript=
var numbers: Set<Int> = [5, 6, 7, 8]
var isPresent = numbers.contains(7); // true - элемент есть
isPresent = numbers.contains(34); // false - элемент отсутствует
```
Хотя множество представляет неупорядоченный набор, но с помощью метода sorted() мы можем отсортировать его:
```javascript=
var numbers: Set<Int> = [4, 7, 2, 6]
print(numbers.sorted()) // [2, 4, 6, 7]
```
### Операции над множествами
Особую ценность среди операций представляют операции, предназначенные специально для множеств: объединение, пересечение, разность множеств.

- intersection(): пересечение множеств, возвращает общие для обоих множеств элементы
- symmetricDifference(): возвращает не общие (не пересекающиеся) для обоих множеств элементы (симметрическая разность)
- union(): объединение двух множеств
- subtract(): разница множеств, возвращает элементы первого множества, которые отсутствуют во втором
```javascript=
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]
```
## Цикл for
С помощью цикла for-in мы можем перебрать элементы коллекции (массивы, множества, словари) или последовательности. Он имеет следующую форму:
```javascript=
for объект_последовательности in последовательность {
// действия
}
```
Например, переберем элементы массива:
```javascript=
for item in 1...5 {
print(item)
}
```
Выражение 1...5 образует последовательность из пяти чисел от 1 до 5. И цикл проходит по всем элементам последовательности. При каждом проходе он извлекает одно число и передает его в переменную item. Таким образом, цикл сработает пять раз.
С помощью оператора where можно задавать условия выборки из последовательности элементов:
```javascript=
for i in 0...10 where i % 2 == 0 {
print(i) // 0, 2, 4, 6, 8, 10
}
```
Здесь из последовательности 0...10 извлекаются только те элементы, которые соответствуют условию после оператора where - i % 2 == 0, то есть четные числа.
## Цикл while
Оператор while проверяет некоторое условие, и если оно возвращает true, то выполняет блок кода. Этот цикл имеет следующую форму:
```javascript=
while условие {
// действия
}
```
Например:
```javascript=
var i = 10
while i > 0 {
print(i)
i-=1
}
```
При этом надо внимательно подходить к условию. Если оно всегда будет возвращать true, то мы получим бесконечный цикл, и приложение может зависнуть.
## Цикл repeat-while
Цикл repeat-while сначала выполняет один раз цикл, и если некоторое условие возвращает true, то продолжает выполнение цикла. Он имеет следующую форму:
```javascript=
repeat {
// действия
} while условие
```
Например, перепишем предыдущий цикл while:
```javascript=
var i = 10
repeat {
print(i)
i-=1
} while i > 0
```
Здесь цикл также выполнится 10 раз, пока значение переменной i не станет равно 0.
Но рассмотрим другую ситуацию:
```javascript=
var i = -1
repeat {
print(i)
i-=1
} while i > 0
```
Несмотря на то, что переменная i меньше 0, но цикл выполнится один раз.
## Операторы continue и break
Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его завершения. В этом случае мы можем воспользоваться оператором break.
```javascript=
for i in 0...10 {
if i == 5{
break
}
print(i) // 0, 1, 2, 3, 4
}
```
Поскольку в цикле идет проверка, равно ли значение переменной i числу 5, то когда перебор дойдет до числа 5, сработает оператор break, и цикл завершится.
Теперь поставим себе другую задачу. А что если мы хотим, чтобы при проверке цикл не завершался, а просто переходил к следующему элементу. Для этого мы можем воспользоваться оператором continue:
```javascript=
for i in 0...10 {
if i == 5{
continue
}
print(i) // 0, 1, 2, 3, 4, 6, 7, 8, 9, 10
}
```
В этом случае цикл, когда дойдет до числа 5, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующему элементу последовательности.
---
## Домашнее задание:
1. Создайте кортеж с тремя параметрами: ваш любимый фильм, ваше любимое число и ваше любимое блюдо. Все элементы кортежа должны быть именованы.
Одним выражением запишите каждый элемент кортежа в три константы. Создайте второй кортеж, аналогичный первому по параметрам, но описывающий другого человека (с другими значениями).
Обменяйте значения в кортежах между собой (с использованием дополнительного промежуточного кортежа).
Создайте новый кортеж, элементами которого будут любимое число из первого кортежа, любимое число из второго кортежа и разница любимых чисел первого и второго кортежей.
2. Создайте два числовых множества.
Проверьте вхождение числа 18 в каждом из множеств, Если входит вывести в консоль сообщение «Элемент 18 входит в множество (номер множества)»
Выполнимое все операции со множествами - Пересечение, Объединение, Симметрическая разность, Разность. И выведите все множества в консоль
---