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)) // 10Swift 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ênHà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.
Thử thách
DễĐọc hai dòng đầu vào:
- Một số nguyên
x - 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:
addXcộngxvào đối sốsquaretrả về bình phương của đối sốnegatetrả 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,-3Tự 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
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