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)) // 40Closure đượ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.
Thử thách
Trung bìnhTạo hai hàm tạo closure:
greaterThan(_ k: Int) -> (Int) -> Bool: trả về một vị từ làtruekhi đối số của nó lớn hơn nghiêm ngặtkscaleBy(_ k: Int) -> (Int) -> Int: trả về một hàm nhân đối số của nó vớik
Đọc ba dòng:
- Một số nguyên
threshold - Một số nguyên
scale - 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:
- Các số lớn hơn ngưỡng (lọc bằng closure từ
greaterThan), được nối bằng, - Các số tương tự sau khi được nhân theo tỉ lệ (ánh xạ bằng
scaleBy), được nối bằng, - 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
3Tự 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
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