Menu
CoddyTech

Closure cơ bản

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

Closure là một khối code độc lập mà bạn có thể truyền đi và gọi sau. Cú pháp đầy đủ ghi rõ kiểu của tham số và giá trị trả về:

let double = { (n: Int) -> Int in
    return n * 2
}
print(double(5))                  // 10

Swift có thể suy luận kiểu dữ liệu khi ngữ cảnh rõ ràng, nên bạn hiếm khi cần viết dạng đầy đủ. Bên trong map, filter, v.v., dạng rút gọn thường được dùng hơn:

let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 }    // Ngắn gọn nhất, $0 là đối số (argument) đầu tiên

Hàm bao đóng (closure) là các giá trị. Bạn có thể lưu chúng vào biến (variable), trả về chúng từ hàm (function) và truyền chúng làm đối số (argument). Đó là toàn bộ lý do khiến map hoạt động.

challenge icon

Thử thách

Dễ

Đọc hai dòng đầu vào:

  1. Một số nguyên x
  2. Một danh sách số nguyên được phân tách bằng dấu phẩy

Định nghĩa ba hàm đóng, mỗi hàm có kiểu (Int) -> Int:

  • addX cộng x vào đối số
  • square trả về bình phương của đối số
  • negate trả về đối số với dấu ngược lại

Áp dụng từng hàm đóng cho mọi phần tử trong danh sách bằng map. In ra ba dòng, mỗi dòng ứng với một hàm đóng, với các kết quả được nối bằng ,:

addX: ...
square: ...
negate: ...

Với đầu vào 10 ở dòng 1 và 1,2,3 ở dòng 2, đầu ra là:

addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3

Tự làm thử

let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: định nghĩa ba closure kiểu (Int) -> Int rồi dùng từng closure để map nums
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