Menu
CoddyTech

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.

challenge icon

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 n và một closure builder: (Int) -> String
  • Gọi builder cho từng i từ 1 đến n (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 ","
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