Menu
Coddy logo textTech

Перечисления с методами

Часть раздела Объектно-ориентированное программирование путешествия по 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]
challenge icon

Задание

Легко

Завершите перечисление 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]))
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Песочница Swift