Trong swift: func là gì?, closure là gì?
Trong bài viết này cúng ta cùng tìm hiểu: Function là gì? Closure là gì? Chúng khác nhau ra sao? Khi nào thì sử dụng Closure? Func là một Method gói gọn các câu lệnh trong nó, để thực hiện một chức năng cụ thể. Func: Khai báo hàm (Function Declaration) (2)(3): gồm tên hàm, tham ...
Trong bài viết này cúng ta cùng tìm hiểu:
- Function là gì?
- Closure là gì?
- Chúng khác nhau ra sao?
- Khi nào thì sử dụng Closure?
Func là một Method gói gọn các câu lệnh trong nó, để thực hiện một chức năng cụ thể.
Func:
- Khai báo hàm (Function Declaration) (2)(3): gồm tên hàm, tham số (parameter) đầu vào (2), kiểu trả về (return type) (3)
- Phần thâm hàm (Function Definition) (4): nằm trong dấu {...}, chứa các câu lệnh for...in hoặc func, ....để sử lý tham số đầu vào, return ra giá trị trả về
- Chỉ được sử dụng khi nó được gọi ra (1)
Function được sử dụng rất nhiều trong code, và cách viết để sử dụng nó cũng rất đa dạng:
- Không có tham số đầu vào nhưng vẫn có giá trị trả về
- Không có tham số đầu vào cũng không có tham số trả về
- Tham số đầu vào có thể có nhiều giá trị, một mảng (array), hoặc cả một func,... và giá trị trả về cũng vậy
- ...
Dưới đây là một số ví dụ: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html
Lưu ý:
- Trong Function chỉ return một lần
- Một Function sau khi return xong sẽ được giải phóng bộ nhớ.
- Tham số truyền vào mặc định là hằng số - không đổi. Vì vậy để thay đổi được tham số (parameter) đầu vào trong func cần sử dụng inout và &
Ồ nhìn này Đây có phải là một cách viết khác của func không vậy, sao nhìn giống func thế.
Thật ra thì đây là một Function được rút gọn. Trong swift được gọi là Closure
Closure là một block code, chính xác hơn thì closure tiến hoá từ block code. Closure không có tên và có thể gán vào một biến, lúc này được lưu dưới dạng một property (escape) hoặc được sử dụng luôn khi không cần tái sử dụng (non-escape)
Vậy làm sao để viết 1 closure, rút gọn nó thế nào. Các bạn tham khảo bài viết của anh Thắng: https://viblo.asia/p/funtion-tien-hoa-tro-thanh-closure-va-cai-ket-bat-ngo-gGJ59YMJ5X2
Closure đang được gán vào 1 biến (escape)
Vậy Closure có khác Function không?
No No. Về bản chất Closure không khác gì Function. Closure chỉ là một bản viết tắt của Function. Bởi vậy closure ngắn gọn hơn, tiện dụng hơn và giúp thư viện chuẩn Standard Library của Swift mạnh mẽ hơn, tối giản số dòng code.
Ví dụ Standard Library kết hợp cùng closure:
Lưu ý:
- Chuyện gì sẽ xảy ra nếu Closure chỉ được gọi đến khi Function return, đã giải phóng bộ nhớ? Tất nhiên là lỗi rùi. Làm sao để khắc phục lỗi này? Để khắc phục lỗi này chúng ta cần thêm @escaping trước closure muốn gọi
- Thường thì Escaping Closure được sử dụng trong Function liên quan đến request server hoặc function asynchronous
Tham Khảo: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94
Khi bạn đủ trình độ thì sử dụng thôi