Menu
CoddyTech

Enum với phương thức

Thuộc phần Lập trình hướng đối tượng trong hành trình Swift của Coddy. Bài học 15 trên 57.

enum định nghĩa một kiểu gồm một tập hợp cố định các trường hợp. Giá trị được viết với dấu chấm, và switch phải xử lý mọi trường hợp, vì vậy khi thêm một trường hợp sau này, mọi chỗ cần cập nhật sẽ hiện ra:

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")
}

Đầu ra:

right

Enum có thể có phương thức và thuộc tính được tính toán. Bên trong enum, self là case hiện tại:

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)

Đầu ra:

east
east

raw value gán một giá trị cố định thuộc một kiểu cho mỗi trường hợp. init(rawValue:) hoạt động theo chiều ngược lại và trả về nil khi không có trường hợp nào khớp:

enum Size: String {
    case small = "S", medium = "M", large = "L"
}

print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)

Đầu ra:

M
true
true

Giá trị liên kết cho phép mỗi trường hợp mang dữ liệu riêng, nhờ đó một kiểu có thể chứa các giá trị có cấu trúc khác nhau. switch liên kết dữ liệu bằng 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 })

Đầu ra:

[20, 55]
challenge icon

Thử thách

Dễ

Hoàn thiện enum Command với các trường hợp forward, back, left và right, cùng các giá trị thô F, B, L và R. Thêm thuộc tính được tính toán step trả về mức thay đổi vị trí: tiến 1, lùi -1, rẽ trái và rẽ phải 0. Sau đó hoàn thiện run(_:), hàm này chuyển từng ký tự thành một lệnh bằng init(rawValue:) (bỏ qua các ký tự không xác định) và trả về position 2, turns 1, skipped 1.

Code được cung cấp đọc một dòng gồm các chữ cái lệnh và in ra kết quả của run(_:).

Viết code trong Command.swift và Functions.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

// Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Swift