Bắt giữ giá trị
Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 40 trên 56.
Closure ghi nhớ các biến nằm trong phạm vi khi nó được tạo. Phần thân closure có thể đọc và thậm chí thay đổi chúng sau đó, ngay cả khi hàm bao quanh đã trả về. Đây gọi là capture.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2
print(next()) // 3Mỗi lần gọi makeCounter sẽ tạo ra một count mới hoàn toàn, vì vậy hai bộ đếm không bao giờ dùng chung trạng thái:
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2Việc ghi nhận trạng thái giúp closure mạnh hơn hàm thông thường: chúng mang theo trạng thái. Bạn sẽ thấy thủ thuật tương tự trong JavaScript, Python và nhiều ngôn ngữ khác.
Thử thách
Trung bìnhTạo một bộ tạo bộ đếm nhỏ.
Định nghĩa hàm makeCounter(start: Int, step: Int) trả về một closure có kiểu () -> Int. Mỗi lần gọi closure sẽ trả về giá trị tiếp theo: lần gọi đầu tiên trả về start, lần tiếp theo trả về start + step, lần tiếp theo là start + 2*step, và cứ tiếp tục như vậy.
Đọc ba số nguyên từ đầu vào: start, step và n. Tạo bộ đếm với start và step, sau đó gọi bộ đếm n lần và in từng kết quả trên một dòng riêng.
Với đầu vào 5 / 3 / 4, đầu ra là:
5
8
11
14Tự làm thử
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO: Tạo hàm (function) makeCounter(start:step:) -> () -> Int để lưu giá trị hiện tại
// Sau đó gọi hàm này n lần và in ra từng kết quả
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