Перечисления с методами
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 15 из 57.
enum определяет тип с фиксированным набором вариантов. Значения записываются с точкой, а switch должен обрабатывать каждый вариант, поэтому при последующем добавлении варианта в каждом месте, требующем обновления, появится уведомление:
enum Direction {
case north, east, south, west
}
let heading = Direction.east
switch heading {
case .north: print("up")
case .east: print("right")
case .south: print("down")
case .west: print("left")
}Вывод:
rightПеречисления могут иметь методы и вычисляемые свойства. Внутри них self — это текущий вариант:
enum Direction {
case north, east, south, west
var turnedRight: Direction {
switch self {
case .north: return .east
case .east: return .south
case .south: return .west
case .west: return .north
}
}
}
print(Direction.north.turnedRight)
print(Direction.west.turnedRight.turnedRight)Вывод:
east
eastИсходное значение связывает с каждым вариантом фиксированное значение одного типа. init(rawValue:) работает в обратном направлении и возвращает nil, если ни один вариант не совпадает:
enum Size: String {
case small = "S", medium = "M", large = "L"
}
print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)Вывод:
M
true
trueСвязанные значения позволяют каждому варианту содержать собственные данные, благодаря чему один тип может хранить значения разной структуры. switch связывает данные с помощью let:
enum Payment {
case cash(amount: Int)
case card(number: String, amount: Int)
var amount: Int {
switch self {
case .cash(let amount): return amount
case .card(_, let amount): return amount
}
}
}
let payments: [Payment] = [.cash(amount: 20), .card(number: "4242", amount: 55)]
print(payments.map { $0.amount })Вывод:
[20, 55]Задание
ЛегкоЗавершите перечисление Command вариантами forward, back, left и right, которым соответствуют исходные значения F, B, L и R. Добавьте вычисляемое свойство step, возвращающее изменение позиции: forward — 1, back — -1, left и right — 0. Затем завершите run(_:): эта функция преобразует каждый символ в команду с помощью init(rawValue:) (пропуская неизвестные символы) и возвращает position 2, turns 1, skipped 1.
Предоставленный код считывает одну строку, содержащую буквы команд, и выводит результат run(_:).
Ваш код должен находиться в Command.swift и Functions.swift. В main.swift находится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книг3Свойства: углублённое изучение
Вычисляемые свойстваНаблюдатели свойствСтатические членыПеречисления с методамиПовторение — журнал температурыПотренируйтесь самостоятельно: Песочница Swift