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:
rightEnum 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
eastraw 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
trueGiá 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]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]))
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpPhương thức và selfHàm khởi tạoLớp là tham chiếuÔn tập: Thẻ thư viện2Struct và kiểu giá trị
StructNgữ nghĩa giá trịPhương thức thay đổiStruct hay classÔn tập: mặt hàng trong kho5Kế thừa
Lớp conGhi đè phương thứcHàm khởi tạo và superfinal và hệ phân cấpÔn tập: hệ phân cấp nhân viên8Các giao thức tiêu chuẩn
CustomStringConvertibleEquatableComparableHashableÔn tập: Sắp xếp tùy chỉnh3Tìm hiểu sâu về thuộc tính
Thuộc tính tính toánQuan sát thuộc tínhThành viên tĩnhEnum với phương thứcÔn tập: Nhật ký nhiệt độTự luyện tập: Playground Swift