Урок 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

Поддержите наш проект, и помогите изменить подход к обучению!

Поддержите наш проект, и помогите изменить подход к обучению!

Развивайся вместе с нами