--- 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] ``` Можете использовать этот метод, когда вам нужно отсортировать пользователей, например, по возрасту. --- ## Объединение, пересечение, разность множеств Особую ценность среди операций представляют операции, предназначенные специально для множеств: объединение, пересечение, разность множеств. Эти операции помогут вам обойтись без лишнего кода и увеличить скорость работы программы. ![](https://i.imgur.com/OY0VeYu.png) --- ## Объединение, пересечение, разность множеств **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, то выполняет блок кода. ![](https://i.imgur.com/3kKglBY.png) Этот цикл имеет следующую форму: ``` 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/) --- # Домашнее задание ...