Menu
CoddyTech

Xây dựng pipeline

Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 31 trên 56.

Các phương thức bạn đã học, map, filter, reduce, compactMap, flatMap, sorted(by:), là bộ công cụ Swift dùng hằng ngày. Code thực tế kết hợp chúng với nhau.

struct Order {
    let item: String
    let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
    .filter { $0.qty > 0 }
    .sorted { $0.qty > $1.qty }
    .map { $0.item }
print(names)                  // ["milk", "apple"]

Đọc chuỗi từ trên xuống dưới: giữ lại các đơn hàng không trống, sắp xếp theo số lượng giảm dần, rồi chỉ giữ lại tên.

Pipeline hoạt động hiệu quả nhất khi mỗi bước chỉ có một mục đích. Nếu bạn thấy mình đang làm hai việc cùng lúc bên trong một hàm đóng (closure), vừa ánh xạ vừa lọc, hãy tách chúng thành hai bước. Chuỗi này vẫn dễ đọc khi dài thêm.

challenge icon

Thử thách

Trung bình

Đọc một dòng đầu vào: danh sách các mục name:price:qty được phân tách bằng dấu phẩy. Một số mục không đúng định dạng và cần được bỏ qua: mọi mục có giá hoặc số lượng không phải là số nguyên hợp lệ.

Tạo một quy trình xử lý để tạo một dòng cho mỗi mục hợp lệ có qty > 0, được sắp xếp theo tổng (price * qty) theo thứ tự giảm dần, với định dạng:

<name>: <total>

Sau các dòng cho từng mục, in ra một dòng tổng kết: Sum: <n> kèm tổng cộng.

Với đầu vào apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7, đầu ra là:

milk: 20
salt: 14
apple: 6
Sum: 40

Tự làm thử

let entries = readLine()!.components(separatedBy: ",")

// TODO: dùng chuỗi xử lý compactMap (phân tích), filter (qty > 0),
// sorted (total giảm dần), map (định dạng); in các dòng và Sum
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 Logic và luồng thực thi

Tự luyện tập: Playground Swift