Menu
CoddyTech

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())                    // 3

Mỗ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())                       // 2

Việ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.

challenge icon

Thử thách

Trung bình

Tạ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
14

Tự 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ả
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