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.
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:
- Các số nguyên (theo thứ tự đầu vào), được nối bằng
, - Số mục đã bị loại bỏ (không thể phân tích được)
- 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
53Tự 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
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
1Chuỗi chuyên sâu
Đếm và chỉ sốChữ hoa, chữ thường và xóa khoảng trắngTìm kiếm trong chuỗiTách và nối chuỗiThay thế chuỗi conÔn tập: Kiểm tra tên người dùng4Tập hợp
Tạo tập hợpPhép hợp và phép giaoPhép trừ và hiệu đối xứngTập con và tập hợp conÔn tập: Bộ lọc thẻ7Dự án: Theo dõi thói quen
Tổng quan dự ánĐánh dấu hoàn thành10Dự án: bộ máy trắc nghiệm
Tổng quan dự ánĐặt câu hỏiTự luyện tập: Playground Swift