Menu
CoddyTech

compactMap

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

compactMap là map sau khi lọc bỏ các giá trị tùy chọn. Closure có thể trả về một Optional; compactMap loại bỏ các kết quả nil và mở gói các kết quả còn lại.

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers)               // [3, 7, 1]

Int("hi") trả về nil vì không thể phân tích một số từ "hi". compactMap tự động loại bỏ các giá trị đó và trả về một [Int] gọn gàng.

Nếu không có nó, bạn sẽ viết strings.map { Int($0) } và nhận được một [Int?] lẫn các giá trị nil, rồi phải tự lọc chúng ra. compactMap gộp cả hai bước thành một.

challenge icon

Thử thách

Dễ

Đọc một dòng đầu vào: một chuỗi gồm các số nguyên và văn bản linh tinh được phân tách bằng dấu phẩy (một số mục không thể phân tích được).

In ra:

  1. Các số nguyên (theo thứ tự đầu vào), được nối bằng ,
  2. Số mục đã bị loại bỏ (không thể phân tích được)
  3. Tổng các số nguyên đã phân tích được

Với đầu vào 3,hi,7,!,1,42,oops, đầu ra là:

3,7,1,42
3
53

Tự làm thử

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

// TODO: dùng compactMap để chuyển thành số nguyên; in ra chuỗi sau khi dùng joined, số phần tử bị loại bỏ và tổng
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