Урок 7. Условная конструкция switch
Главная / Уроки / Страница блока Основы / Урок 7. Условная конструкция switch / Задача 7. Условная конструкция switch
18 Декабря 2022
Задача 7.1
Реализуйте логику светофора, если горит зеленый то на консоль выведите “Можно ехать!”, если желтый то “Приготовьтесь!”, а на красный “Стоп!”
let trafficLight = "green"
switch trafficLight {
case "red":
print("Стоп!")
case "yellow":
print("Приготовьтесь!")
case "green":
print("Можно ехать!")
default:
print("Не корректный цвет")
}
Свойство trafficLight должно быть константой.
Сопоставляем значение свойства trfficLight с цветом, срабатывает один из кейсов, выполняется код внутри, и дальше компилятор не проверяет условия.
Если вы определили последний кейс в дефолтной ветке, это считается корректным решением, так как больше трех цветов мы не будем использовать в нашей программе:
let trafficLight = "green"
switch trafficLight {
case "red":
print("Стоп!")
case "yellow":
print("Приготовьтесь!")
default:
print("Можно ехать!")
}
Задача 7.2
У вас должно быть четыре свойства, первое отвечает за оригинальную стоимость, вторая за промокод, третья за скидку, а четвертая за финальную стоимость, которую пользователь получит после внесения промокода. Значение для сопоставления будет промокод. Внутри кейсов произведите нужные расчеты, что бы получить финальную стоимость.
Напишите программу для интернет магазина, если у пользователя есть промокод “BLACKFRIDAY” то он получает 50 процентов скидки, если у него есть промокод “CYBERMONDAY” то он получает 30 процентов скидку, во всех остальных случаях он должен заплатить полную стоимость, выведите на консоль конечную стоимость.
let originalPrice = 100.0
let discountCode = "BLACKFRIDAY"
var discountAmount = 0.0
var finalPrice = 0.0
switch discountCode {
case "BLACKFRIDAY":
discountAmount = originalPrice * 0.50
case "CYBERMONDAY":
discountAmount = originalPrice * 0.30
default:
break
}
finalPrice = originalPrice - discountAmount
print(finalPrice)
Все свойства кроме финальной цены и скидки должны быть константами.
Компилятор сопоставляет значение свойства discountCode с значениями кейса, в нашем случае отрабатывает первый кейс, и выполняется код внутри, где мы пере определяем свойство discountAmount, а уже после конструкции switch рассчитываем финальную стоимость и выводим результат на консоль.
В дефолтной ветке, мы не определяем последний кейс, потому что нам нужно чтобы была еще и оригинальная стоимость.
Можно было выполнить задание следующим образом:
let originalPrice = 100.0
let discountCode = "BLACKFRIDAY"
switch discountCode {
case "BLACKFRIDAY":
let discountAmount = originalPrice * 0.50
let finalPrice = originalPrice - discountAmount
print(finalPrice)
case "CYBERMONDAY":
let discountAmount = originalPrice * 0.30
let finalPrice = originalPrice - discountAmount
print(finalPrice)
default:
print(originalPrice)
}
Но в таком случае мы будем дублировать один и тот же код в двух кейсах, и такую логику тяжело надстраивать, если у вас появится еще какой нибудь промокод, ваша конструкция очень быстро разрастется.
Так же возникнет сложность, если вам вдруг понадобится финальная стоимость за пределами конструкции, придется переделать очень много кода. Одним словом старайтесь разделять логику на мелкие компоненты, и не пытайтесь реализовать все в одном алгоритме.
Задача 7.3
У вас должно быть четыре свойства, первое отвечает за количество посетителей, вторая за тип услуги, третья за стоимость услуги на одного человека, а четвертая за общую стоимость. Значение для сопоставления будет тип услуги.
Напишите программу для столовой, в которой есть два типа предоставления услуг “sit down” где ты платишь 150 рублей за человека и “buffet” 100 рублей за человека. Определите стоимость за одного человека и посчитайте общую стоимость за пришедшую компанию людей.
let numberOfPeople = 4
let mealType = "buffet"
var costPerPerson = 0
let totalCost: Int
switch mealType {
case "sit-down":
costPerPerson = 150
case "buffet":
costPerPerson = 100
default:
print("Invalid meal type")
}
totalCost = costPerPerson * numberOfPeople
print(totalCost)
Свойства для количества людей и тип услуги должны быть константами.
Компилятор сопоставляет значение свойства mealType с значениями кейса, в нашем случае отрабатывает второй кейс, и выполняется код внутри, где мы задаем новое значение для свойства costPerPerson, а уже после конструкции switch рассчитываем общую стоимость и выводим результат на консоль.
Если вы выполнили задание следующим образом:
let numberOfPeople = 4
let mealType = "buffet"
switch mealType {
case "sit-down":
let costPerPerson = 150
let totalCost = costPerPerson * numberOfPeople
print(totalCost)
case "buffet":
let costPerPerson = 100
let totalCost = costPerPerson * numberOfPeople
print(totalCost)
default:
print("Invalid meal type")
}
То такое решение, не совсем корректно, вы дублируете один и тот же код в двух кейсах, и такую логику тяжело надстраивать, если у вас появится еще какая нибудь услуга, ваша конструкция очень быстро разрастется.
Так же возникнет сложность, если вам вдруг понадобится общая стоимость за пределами конструкции, придется переделать очень много кода. Одним словом старайтесь разделять логику на мелкие компоненты, и не пытайтесь реализовать все в одном алгоритме.
Задача 7.4
Вам нужно два свойства, первое с днем недели, а второе с номером текущей пятницы в месяце.
Создайте алгоритм будильника, при котором в понедельник и среду вы будете отображать на консоли сообщение: “wake up at 8:30 am”, в четверг, на консоли должны видеть: “wake up at 9:00 am”, и каждую четвертую пятницу месяца на консоли должно быть: “wake up at 10:30”. А во все остальные дни: “today is a day off”
let today = "Wednesday"
let week = 3
switch today {
case "Monday", "Wednesday":
print("wake up at 8:30 am")
case "Thursday":
print("wake up at 9:00 am")
case "Friday" where week == 4:
print("wake up at 10:30 am")
default:
print("today is a day off")
}
Все два свойства являются константами, в контексте мы не планируем их изменять.
Далее мы сопоставляем значение свойства today с каждым кейсом, если значение today равно “Monday” и “Wednesday” то выполнится первый кейс, и на консоли мы увидим “wake up at 8:30”, если today равно “Thursday” то выполнится второй кейс и на консоли мы увидим “wake up at 9:00”, в случае если today равно “Friday”, где week равна 4, то сработает третий кейс. Ну и все остальное будет попадать в дефолтную ветку, которая выводит на консоль сообщение “today is a day off”
Важно отметить, что компилятор будет выполнять только один из кейсов, в зависимости от значения today, то есть если отработает один кейс, остальные проверяться и выполняться не будут. И если не один из кейсов не соответствует значению свойства today, то сработает ветка default.
Давайте теперь посмотрим на не оптимальное решение:
let today = "Wednesday"
let week = 3
switch today {
case "Monday":
print("wake up at 8:30 am")
case "Wednesday":
print("wake up at 8:30 am")
case "Thursday":
print("wake up at 9:00 am")
case "Friday" where week == 4:
print("wake up at 10:30 am")
case "Tuesday", "Saturday", "Sunday":
print("today is a day off")
default:
break
}
Первые два кейса выполняют одни и те же действия, а как вы уже знаете, дублировать код – плохо.
Так же обратите внимание на то что дефолтная ветка становится бесполезной, так не должно быть, в ней всегда можно определить оставшиеся варианты, и “Tuesday”, “Saturday”, “Sunday” отлично для этого подходят.
Еще большей ошибкой будет каждый день недели выносить в отдельный кейс, и дублировать код в каждом из них:
Поддержите наш проект, и помогите изменить подход к обучению!
Развивайся вместе с нами
Поддержите наш проект, и помогите изменить подход к обучению!
Address List
Social Networks
Поддержите наш проект, и помогите изменить подход к обучению!
Social Networks