Trailing closure
Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 39 trên 56.
Khi một bao đóng (closure) là đối số cuối cùng của một hàm (function), bạn có thể viết nó bên ngoài dấu ngoặc đơn. Đây là dạng bao đóng ở cuối, và đó là cách code Swift đọc tự nhiên.
let nums = [1, 2, 3]
// Dạng thông thường
let a = nums.map({ $0 * 2 })
// Dạng closure đặt ở cuối
let b = nums.map { $0 * 2 }Nếu closure là đối số duy nhất, dấu ngoặc đơn cũng biến mất. Vì vậy, mọi thứ bạn đã thấy cho đến giờ đều trông như một cấu trúc điều khiển tùy chỉnh.
Bạn có thể tự viết hàm (function) nhận closure theo cách tương tự:
func repeatN(_ n: Int, action: () -> Void) {
for _ in 0..<n {
action()
}
}
repeatN(3) {
print("hi")
}Cách viết trailing closure khiến repeatN(3) { ... } trông như một vòng lặp có sẵn. Đó chính là mục đích: các cấu trúc điều khiển bạn tự xây dựng trông giống hệt những cấu trúc trong thư viện chuẩn.
Thử thách
DễĐịnh nghĩa một hàm collect có các đặc điểm sau:
- Nhận một số nguyên
nvà một closurebuilder: (Int) -> String - Gọi
buildercho từngitừ1đếnn(bao gồm cả hai đầu) và trả về mảng các chuỗi tạo ra
Đọc một số nguyên từ stdin, gọi collect với số nguyên đó bằng một closure ở cuối, tạo ra "i=<i>" cho mỗi giá trị, rồi in ra kết quả đã nối bằng ,.
Với đầu vào 4, đầu ra là i=1,i=2,i=3,i=4.
Tự làm thử
let n = Int(readLine()!)!
// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// Sau đó gọi collect(n) { ... } và in ra kết quả nối bằ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