Урок 13. Перечисления
Главная / Уроки / Страница блока Основы / Урок 13. Перечисление / Задача 13. Перечисления
3 Февраля 2023
Задача 13.1
Выполните перебор по массиву, для проверки значения используйте условную конструкцию if.
Создайте массив на основе следующего перечисления:
enum CarBrand {
case toyota
case honda
case bmv
case tesla
}
Выведете на консоль сообщение: “Снижение цены на 30%”, в том случае если в списке будет .toyota
enum CarBrand {
case toyota
case honda
case bmv
case tesla
}
let carBrands: [CarBrand] = [.tesla, .bmv, .honda, .toyota]
for carBrand in carBrands {
if carBrand == .toyota {
print("Снижение цены на 30%")
}
}
Обратите внимание, что массив carBrands должен быть константой, мы его не изменяем, а просто перебираем.
Что бы найти в списке кейс .toyota, делаем перебор при помощи цикла for, внутри которого проверяем равен ли элемент из списка .toyota, если условие удовлетворяет, то выводим на консоль сообщение.
Есть еще более элегантное решение с использованием метода .contains():
enum CarBrand {
case toyota
case honda
case bmv
case tesla
}
let carBrand: [CarBrand] = [.toyota, .honda, .bmv, .tesla]
if carBrand.contains(.toyota) {
print("Cнижение цены")
}
Метод contains проверит наличие элемента в массиве и вернет логическое значение, true если элемент есть, и false если элемента нет. Таким образом нам нет необходимости перебирать массив.
Задача 13.2
Для решения этой задачи, вам понадобится свойство с типом дроги и пустой массив, с типами автомобилей (массив может быть типа String, это будут исходные значения кейсов). В алгоритме используйте конструкцию switch, где значение для сопоставления это тип дороги.
Перед вами два перечисления:
enum CarType {
case sedan
case suv
case hatchback
case truck
}
enum RoadType {
case paved
case gravel
}
Первое отвечает за тип автомобиля, а второе за тип дорожного покрытия. Продумайте алгоритм, при котором в зависимости от покрытия, будут фильтроваться типы автомобилей. Если покрытие paved то это sedan и hatchback, если gravel то suv и truck. Выведите на консоль сообщение: ” type road: <тип дороги>, cars: <список автомобилей, подходящих под эту дорогу>
enum CarType: String {
case sedan
case suv
case hatchback
case truck
}
enum RoadType {
case paved
case gravel
}
let roadType = RoadType.gravel
switch roadType {
case .paved:
print("type road: \(roadType), cars \(CarType.sedan), \(CarType.hatchback)")
case .gravel:
print("type road: \(roadType): \(CarType.suv), \(CarType.truck)")
}
Нам обязательно нужно свойство для сопоставления roadType, которое будет хранить текущее покрытие. Оно является константой, потому что мы его не меняем, а просто сопоставляем.
Обратите внимание, что нам не обязательно прописывать исходные значения, если мы хотим использовать название самого кейса.
К конструкции switch если кейс .paved то мы выводим одно сообщение, если .gravel то другое. В рамках данного контекста это не плохое решение, но мне больше нравится следующее:
enum CarType: String {
case sedan
case suv
case hatchback
case truck
}
enum RoadType {
case paved
case gravel
}
let roadType = RoadType.gravel
var carTypes: [String] = []
switch roadType {
case .paved:
carTypes.append(CarType.sedan.rawValue)
carTypes.append(CarType.hatchback.rawValue)
case .gravel:
carTypes.append(CarType.suv.rawValue)
carTypes.append(CarType.truck.rawValue)
}
print("type road: \(roadType), cars: \(carTypes.joined(separator: ", "))")
Здесь мы в конструкции switch добавляем в новый массив исходные значения нужных нам кейсов. и уже после конструкции switch выводим один print.
Этот код легче дорабатывать, и если нам вдруг, в дальнейшем, потребуется результат, мы возьмем список автомобилей carTypes. В первом же варианте результат скрыт глубоко в логику switch, и он нам не доступен.
Всегда старайтесь думать наперед!
Задача 13.3
У двух перечислений должны быть исходные значения с типом String. Так же тебе потребуется пустой массив с типом String, или с типом Vegetabel (из этого массива в дальнейшем придется сделать строковый), а так же свойство содержащее время принятия пищи. Для определения какое сейчас время используйте switch. Для вывода списка ингредиентов используйте метод joined(separator:)
Создайте два перечисления, первое будет содержать время принятия пищи (завтрак, обед и ужин), а второе овощи (например картошка, морковка, брокколи и другие). Продумайте алгоритм при котором в зависимости от времени принятия пищи, в блюдо будут добавляться определенные овощи. В конце выведите на экран сообщение: “Для приготовления <время принятия пищи>, потребуются следующие овощи <список овощей>”.
enum Vegetable: String {
case carrot = "Морковь"
case potato = "Картошка"
case broccoli = "Брокколи"
case cucumber = "Огурец"
case tomato = "Помидор"
}
enum Meal: String {
case breakfast = "Завтрака"
case lunch = "Обеда"
case dinner = "Ужина"
}
var ingredients = [String]() // 1
let meal = Meal.breakfast // 2
switch meal { // 3
case .breakfast:
ingredients.append(Vegetable.broccoli.rawValue) // 4
ingredients.append(Vegetable.cucumber.rawValue) // 5
case .lunch:
ingredients.append(Vegetable.potato.rawValue)
ingredients.append(Vegetable.tomato.rawValue)
case .dinner:
ingredients.append(Vegetable.cucumber.rawValue)
ingredients.append(Vegetable.carrot.rawValue)
}
print("Для приготовления \(meal.rawValue), нужны следующие ингредиенты: \(ingredients.joined(separator: ", "))")
У вас есть два перечисления с строковыми исходными значениями, они нам нужны для красивого отображения в print.
Пустой массив с типом String, является переменной, в который мы планируем добавить ингредиентов (1). Так же у нас есть свойство meal, которое хранит в себе определенный кейс типа Meal, то есть время приема пищи (2). В конструкции switch мы проверяем, если свойство meal хранит в себе .breakfast (3), то мы добавляем в массив исходное значение кейса .broccoli и .cucumber (шаг 4 и 5)
Можно было решить задание немного иначе:
enum Vegetable: String {
case carrot = "Морковь"
case potato = "Картошка"
case broccoli = "Брокколи"
case cucumber = "Огурец"
case tomato = "Помидор"
}
enum Meal: String {
case breakfast = "Завтрака"
case lunch = "Обеда"
case dinner = "Ужина"
}
var ingredients = [Vegetable]() // 1
let meal = Meal.breakfast
switch meal {
case .breakfast:
ingredients.append(.broccoli) // 2
ingredients.append(.cucumber)
case .lunch:
ingredients.append(.potato)
ingredients.append(.tomato)
case .dinner:
ingredients.append(.cucumber)
ingredients.append(.carrot)
}
var vegetables = [String]() // 3
for ingredient in ingredients { // 4
vegetables.append(ingredient.rawValue)
}
print("Для приготовления \(meal.rawValue), нужны следующие ингредиенты: \(vegetables.joined(separator: ", "))") // 5
На этот раз массив с типом Vegetable (1), а это значит что в switch мы будем добавлять в массив сами кейсы, а не исходные значения (2). Что бы вывести на консоль готовый список с исходными значениями, мы создаем новый строковый массив (3), после чего перебираем массив с кейсами (4) и добавляем исходное значение каждого из элементов массива ingredients в массив vegetables. После чего выводим результат на консоль (5)
Задача 13.4
Создайте свойство с типом Activity, в ассоциативный параметр передайте нужные данные, и в конструкции switch сопоставьте это свойство с кейсами Activity. Что бы сделать из массива список используйте метод joined(separator:)
Создайте перечисление Activity , со следующими кейсами: reading, running, shopping.
первый кейс должен иметь ассоциативный параметр типа: (book: String), второй: (distance: Double) и третий: (items: [String]). В зависимости от, того какой кейс с типом Activity выбран, выведите на консоль сообщение, если кейс reading: “В настоящее время читаю <книга>”, если кейс running: “Пробежать сегодня <дистанция> км “, если кейс shopping: “Сходить в магазин за: <список покупок>”
enum Activity {
case reading(book: String)
case running(distance: Double)
case shopping(items: [String])
}
let activity = Activity.running(distance: 5.0)
switch activity {
case .reading(let book):
print("В настоящее время читаю \(book)")
case .running(let distance):
print("Пробежать сегодня \(distance) км")
case .shopping(let items):
print("Сходить в магазин за \(items.joined(separator: ", "))")
}
кейсы перечисления обязательно должны быть с маленькой буквы, а ассоциативные параметры с названиями, следующая запись не желательна:
enum Activity {
case reading(String)
case running(Double)
case shopping([String])
}
let activity = Activity.running(5.0)
В таком случае не понятно за что отвечают ассоциативные параметры. Лучше всегда прописывать параметры.
Далее в условной конструкции switch мы сопоставляем свойство activity со всеми кейсами типа Activity. В скобках каждого кейса нам возвращается ассоциативный параметр, который мы инициализировали в момент создания свойства activity. Если вам не понятно как это работает, то предлагаю еще раз пройти урок 13 раздел Ассоциативные параметры.
Поддержите наш проект, и помогите изменить подход к обучению!
Address List
Social Networks
Поддержите наш проект, и помогите изменить подход к обучению!
Поддержите наш проект, и помогите изменить подход к обучению!
Развивайся вместе с нами
Social Networks