Menu
CoddyTech

Trả về 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 41 trên 56.

Bạn đã thấy makeCounter trả về một bao đóng. Mẹo tương tự giúp bạn tạo hành vi có thể cấu hình: nhận tham số một lần, rồi nhận về một hàm sử dụng chúng nhiều lần.

func multiplier(_ k: Int) -> (Int) -> Int {
    return { n in n * k }
}

let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4))                  // 12
print(tenfold(4))                 // 40

Closure được trả về nắm giữ k, vì vậy mỗi lần gọi multiplier(...) sẽ tạo ra một closure hoàn toàn mới với k riêng.

Mẫu này là cốt lõi của code “chiến lược” trong Swift: viết một hàm nhận cấu hình và trả về một closure, sau đó truyền closure đó vào map, filter, sorted(by:) hoặc bất kỳ nơi nào cần một giá trị có dạng hàm.

challenge icon

Thử thách

Trung bình

Tạo hai hàm tạo closure:

  • greaterThan(_ k: Int) -> (Int) -> Bool: trả về một vị từ là true khi đối số của nó lớn hơn nghiêm ngặt k
  • scaleBy(_ k: Int) -> (Int) -> Int: trả về một hàm nhân đối số của nó với k

Đọc ba dòng:

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

In ra ba dòng:

  1. Các số lớn hơn ngưỡng (lọc bằng closure từ greaterThan), được nối bằng ,
  2. Các số tương tự sau khi được nhân theo tỉ lệ (ánh xạ bằng scaleBy), được nối bằng ,
  3. Số lượng phần tử vượt qua bộ lọc

Với đầu vào 5 / 3 / 2,7,3,8,9, đầu ra là:

7,8,9
21,24,27
3

Tự làm thử

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

// TODO: greaterThan, scaleBy; lọc rồi ánh xạ; in ra các phần tử đã nối và số lượ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