---
title: 2.3. Преобразование типов. Условные конструкции
tags: Templates, Talk
description: View the slide with "Slide Mode".
---
# 2.3. Преобразование типов. Условные конструкции
# План занятия
1. Преобразования числовых типов
2. Преобразования целых чисел и чисел с плавающей точкой
3. Преобразование Строк в число и наоборот
4. Условные Конструкции
5. Конструкция if/else
6. Тернарный оператор
7. Конструкция switch
---
## Вспоминаем прошлые занятия
- Чем отличается переменная от константы?
- Какие типы переменных бывают?
- Какие операции можно делать с числовыми переменными?
- Какие операции можно делать с логическими переменными?
---
## Введение
Как мы с вами говорили на предыдущем занятии, Swift строго типизированный язык. Но что же делать, когда нам нужно использовать числовое значение как строковое или наоборот?
---
Любой программист сталкивается с ситуацией, когда необходимо преобразовать данные из одного типа в другой.
Самый распространенный пример — это получение данных с сервера, сервер вам передает данные в строковом формате, а в нем хранится id объекта и вам удобнее работать с ним как с Int форматом.
Тогда на помощь приходит преобразование типов (приведение типов):
```javascript=
let idObjectServer: String = "12537"// Данные от сервера
let idApp = Int(idObjectServer)// Преобразование для приложения
```
---
## Преобразования числовых типов
**Для работы с целыми числами используйте тип данных Int** в любых случаях, даже если работаете с отрицательными числами.
Используя стандартные типы данных в своем коде, не будет возникать ошибок с несоответствием типов, так как переменные будут соответствовать одному типу данных.
Использование других типов данных для хранения целых чисел может быть целесообразным только в тех случаях, когда где-то в программе уже использованы данные типы.
Например, для стандартизации работы программы, для улучшения производительности и работы с памятью.
---
## Преобразования целых чисел и чисел с плавающей точкой
При преобразовании целого числа в число с плавающей точкой нужно указывать явно тип данных, в который мы преобразовываем. Например:
```javascript=
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi равно 3.14159, и для него выведен тип Double
```
Здесь, для соответствия типам данных константу `three` преобразовали **из типа Int в Double** чтобы обе переменные имели одинаковый тип. Если не произвести преобразование будет выведена ошибка о несоответствии типов данных.
Преобразование **из Double в Int** происходит так же. Например:
```javascript=
let integerPi = Int(pi)
// integerPi равен 3, и для него выведен тип Int
```
Если вы преобразуете числа с плавающей точкой в целые числа, дробная часть будет просто убираться. Например, число 5.99 будет равно 5.


Числовые литералы — это числа, стоящие после присвоения переменной без определенного типа. Литералы представляют собой константы, включаемые непосредственно в текст программы.
Литералы не могут быть изменены никоим образом. Кроме того литерал может быть использован там, где используется константа. С другой стороны, в момент написания в коде литерал не имеет типа. Поэтому просто будем называть литералом явное значение, записываемое в Вашем коде.
```javascript=
let Pi = 3 + 0.14159
// Pi равен 3.14159, и для него определен тип Double
```
> Числовыми литералами мы делаем математические преобразования напрямую, так как у литералов нет явного типа данных, а значение выведется уже после исполнения кода компилятором.
>

Чтобы распечатать тип переменной в консоль, можете воспользоваться функцией `type(of:)`.
---
## Преобразование Строк в число и наоборот:
```javascript=
var strNum = "123"
let a:Int? = Int(strNum)
```
```javascript=
let x : Int = 42
var myString = String(x)
```

---
## Условные конструкции

Пример:
Допустим, нам нужно в банкомате выдать некоторую сумму денег, которая может быть доступна для выдачи, если не превышает доступный баланс.
Какие конструкции используются на языке Swift?
---
### Конструкция if/else
Эту конструкцию мы частично затронули с вами в прошлом занятии, давайте рассмотрим ее подробнее.
Данная конструкция проверяется условие в блоке if, если он истинно, выполняется блок if:
```javascript=
if условие {
// Набор действий
}
```
Например:
```javascript=
let num1 = 22
let num2 = 15
if num1 > num2{
print("num1 больше чем num2")
}
```
В данном примере проверяется условие, что первое число больше второго. Если данное условие истинно(true), выполнится блок if, иначе блок просто пропустит компилятор.
Как мы с вами уже знаем все условия должны быть логическими операциями. Если в условии не будет возвращаться логическое значение, такой блок завершится ошибкой. Например:
```javascript=
let num1 = 22
let num2 = 15
if num1{
print("num1 больше чем num2")
}
```
Блок else используется для случаев, когда нужно выполнить действие при условии, которое не было выполнено в блоке if:
```javascript=
let num1 = 22
let num2 = 15
if num1 > num2{
print("num1 больше чем num2")
}
else{
print("num1 меньше чем num2")
}
```
---
### Что же делать в случае когда условий больше чем 2?
В данном случае можете указывать дополнительные условия в блоке `else if`. Пример сравнения чисел:
```javascript=
let num1 = 22
let num2 = 15
if num1 > num2{
print("num1 больше чем num2")
}
else if (num1 < num2){
print("num1 меньше чем num2")
}
else{
print("num1 и num2 равны")
}
```
*Обратите внимание на перенос строки, при написании условной конструкции, мы можем использовать их для того, чтобы сделать чтение кода проще.
### Тернарный оператор
Тернарный оператор используется в случаях обычного сравнения для красоты написания кода. Явных преимуществ тернарного оператора над конструкцией if нет.
Конструкция if и тернарный оператор выполняют одинаковый цикл. Синтаксис оператора:
```javascript=
[первый операнд - условие] ? [второй операнд] : [третий операнд]
```
При выполнении условия выполняется второй операнд, иначе третий:
Например:
```javascript=
var num1 = 10
var num2 = 6
var num3 = num1 > num2 ? num1 - num2 : num1 + num2
```

---
### Конструкция switch
Данная конструкция напоминает конструкцию `if else`. Она так же может обработать несколько условий:
```javascript=
var num: Int = 27
switch num {
case 0:
print("Переменная равна 0")
case 18:
print("Переменная равна 18")
case 27:
print("Переменная равна 27")
default:
print("Не удалось распознать число")
}
```
**Алгоритм работы конструкции switch:**
1. После слова switch указываем сравниваемое значение.
2. Далее это значение поочередно сравнивается со значениями указанными после операторов case.
3. При совпадении выполнится определенный блок case. default блок выполнится в том случае, если сравнения не найдутся в блоках case.
4. При выполнении первого кейса выполнение switch конструкции прекратиться:

В примере переменная num равна 27, следовательно, будет выполнен следующий case:
```javascript=
case 27:
print("Переменная равна 27")
```
Также в любом блоке можно указывать **ключевое слово break для выхода из конструкции switch.**
Например:
```javascript=
var num: Int = 0
switch num {
case 0:
print("Переменная равна 0")
case 22:
break
case 44:
print("Переменная равна 44")
default:
break
}
```
В данном примере, если число не равно 0 или 44, тогда выполнится блок, в котором есть оператор break, и произойдет выход из конструкции switch.
Если нам необходимо сравнить несколько значений, а остальные значения просто вывести в блоке case используем символ нижнего подчеркивания `_`. Например:
```javascript=
let number = 5
switch number {
case 1:
print("Number = 1")
case 2:
print("Number = 2")
case _:
print("Number не равно ни 1, ни 2, но не факт")
}
```
Можно сравнить не только с конкретным значением, но и с группой. Например:
```javascript=
var num: Int = 14
switch num {
case 0, 10: // Если num равно 0 или 10
print("Переменная равна 0 или 10")
case 11..<20: // Если num в диапазоне от 11 до 20, не включая 20
print("Переменная находится в диапазоне от 11 до 20")
case 20...30: // Если num в диапазоне от 20 до 30
print("Переменная находится в диапазоне от 20 до 30")
default:
print("не удалось распознать число")
}
```
Оператор case 0, 10 сработает, только когда значение равно 0 или 10.
Оператор case 11...<20 сработает, если значение будет в диапазоне от 11 до 20 не включая 20.
Оператор case 20...30 сработает, если значение находится в диапазоне от 20 до 30 включая обе границы.
В версии Swift 4 можно не указывать одну из границ. Например:
```javascript=
let num = 8
switch i {
case ...<0:
print("num - отрицательное число")
case 1...:
print("num - положительное число")
case 0:
print("num равно 0")
default:break
}
```
---
### Связывание значений
Механизм связывания значений позволяет определить в блоках case переменные и константы, значения которых будут определены с помощью значения условия:
```javascript=
let number = 5
switch number {
case 1:
print("Number = 1")
case 2:
print("Number = 2")
case let n:
print("Number = \(n)")
}
```
В данном случае, если значение number не равно 1 и 2, то оно передается константе n, которая используется в рамках своего блока case.

----
### Оператор where
В блоке case можно задавать дополнительные условия с помощью оператора where. Например:
```javascript=
let i = 8
switch i {
case let k where k < 0:
print("i - отрицательное число")
case let k where k > 0:
print("i - положительное число")
case 0:
print("i is 0")
default:break
}
```
---
## Домашнее задание:
1.Вам необходимо написать программу для оценки графиков, характеризующих движение валюты в течении дня. У вас есть 3 числа A B C и формула D=B * B - 4AC, где D - возможное движение графика.
Если D > 0 график скорее всего продолжит направление,
Если D < 0 график скорее всего поменяет направление,
Если D = 0 Неопределенная ситуация нужно ждать.
Вывести в консоль строку указывающую движение графика (в зависимости от полученного D)
Реализовать выбор условия 3-мя вариантами (if-else, тернарный оператор, switch)
2.Задание 2. * (Дополнительная)
Вы работаете над приложением, которое предоставляет видеоконтент для пользователей.
Вам нужно реализовать фильтр материалов по 2 характеристикам: пол и возраст.
Категории по возрасту:
* возраст детей от 3 до 17 лет;
* взрослых людей от 18 до 65 лет включительно;
* пожилых людей от 66 лет и без верхнего ограничения.
Алгоритм решения:
Придумайте и проинициализируйте 2 константы или переменные, характеризующие пол и возраст человека.
Используя условные конструкции, напишите программу, которая в зависимости от значений, придуманных вами пола и возраста напечатает в консоль одну из следующих строк:
"Детский контент для девочек"
"Детский контент для мальчиков"
"Взрослый контент для мужчин"
"Взрослый контент для женщин"
"Контент для женщин пожилого возраста"
"Контент для мужчин пожилого возраста"
Во всех, неподходящих под описание случаях, напечатайте в консоль:
"Нет подходящего контента"
Задачу реализовать в playground.
---