Kiến thức căn bản về Swift (Phần 4) - Sức mạnh của Clouses



Nếu bạn đã từng làm việc với block trong C, Objective-C hay lambdas trong Ruby, khi đó bạn sẽ thấy không khó khăn khi tiếp cận với khái niệm Closures trong Swift.
Closures không khác gì nhiều với block của một hàm(Function) nào đó mà bạn thấy trong code. Để hiểu rõ hơn bạn có thể tham khảo bài hướng dẫn sau.

  1. Closure là gì?


Closure là làm một hàm mà không có từ khoá func , có thể có hoặc không có tên đại diện cho closure đó và có thể có từ khóa in hoặc có thể hiểu Closures là một block của một hàm nào đó, nó có thể dùng làm một đối số (argument) hay là một property của object và dùng trong nhiều trường hợp khác nhau mà chúng ta sẽ tìm hiểu trong bài viết này.
Tính linh hoạt - Bạn đã biết về hàm nó cũng khá hữu dụng và linh hoạt, vì thế nên closures cũng như vậy, nó rất linh hoạt và trong bài viết này chúng ta sẽ tìm hiểu vấn đề đó.
Quản lý bộ nhớ - Closure trong Swift có nhiều lợi ích, đặt biệt trong quản lý bộ nhớ cho bạn, developer sẽ không cần lo lắng nhiều quản lý bộ nhớ, swift sẽ tự quản lý điều đó. Nó sẽ tránh được trường hợp retain cycle, giảm memory leaks hoặc crash ứng dụng khi con trỏ bị nil.

  Closures có 3 loại:

  • Global functions - Nó giống như khai báo một biến giá trị nào đó, nó không có khả năng sử dụng và thay đổi bất kỳ các biến giá trị nào nằm ngoài khối block của Closues đó.
Ví dụ:


  • Nested functions - Nó có tên và được tạo ra trong một hàm nào đó, do đó nó chỉ hoạt động trong phạm vi hàm đó thôi, từ đó nó có khả năng sử dụng và thay đổi bất kỳ biến giá trị nào nằm trong phạm vị hàm mà Closure đang lồng bên trong.
Ví dụ:
Ở ví dụ trên biến runningTotal có thể được sử dụng trong Closure incrementer().
  • Closures expressions - Nó không có tên và có khả năng nắm giữ hoặc thay đổi giá trị của một biến nào đó mà biến đó được viết dưới dạng Closure.
Ví dụ:
  1. Cú pháp


Cú pháp để khai báo một Closure có kiểu trả về:
{ (parameters) -> return type  in
Statements
}
Cách khai báo một Closure không kiểu trả về:
{ (parameters) in
statements
}


Lưu ý:
Closure có thể dùng từ khóa inout cho parameter nhưng không thể gán giá trị mặc định cho parameter.
Một số ví dụ về cách khái báo một Closure:
Với các ví dụ bên trên, chúng ta có thể không cần mô tả về các kiểu dữ liệu của các biến Closure vì Swift có khả năng tự suy luận kiểu cho các biến đó. Có thể viết lại như sau:
  1. Các tính năng của Closure

  • Viết tắt tên tham số(Shorthand parameter name)
Swift cung cấp viết tắt tên của các tham số trong thân của Closure, Chúng ta có thể dùng các đối số viết tắc như $0, $1,$2, v.v..
Ví du:


  • Sử dụng và thay đổi các biến giá trị được khái báo bên ngoài Closure nhưng được sử dụng bên trong Closure.(Capturing value)
Bạn có thể xem ví dụ để hiểu hơn về Capturing value:

Lưu  ý: Chỉ có 2 loại nested function và closure expressions mới có tính năng capturing value.
  • Trailing Closure Syntax
Nếu hàm của bạn có một đối số là một closure nằm ở cuối hàm, thì khi gọi hàm đó chúng ta sử dụng cú pháp Trailing Closure.
Ví du:


  • Closure là một reference types(Một kiểu dữ liệu tham chiếu)
Có nghĩa là khi chúng ta gán một closure này sang một biến khác, thì biến khác đó sẽ có khả năng xử lý của closure bị gán.
Ví dụ:
Closure là một trong những thế mạnh và nội dung quan trong của Swift. Chúng ta có thể sử dụng nó một cách linh hoạt, nhanh đồng thời developer dễ viết, đọc và dễ hiểu code xử lý như thế nào.

Hy vọng các bạn thích và học được nhiều kiến thức từ bài viết này. Mong các bạn chia sẽ nó để mọi người cùng học và cùng trao đổi. Mọi thắc mắc hay trao đổi về bài viết, các bạn có thể để lại bình luận bên dưới mình sẽ hỗ trợ sớm nhất. Chân thành cảm ơn các bạn đã theo dõi.
VHX.

Post a Comment

0 Comments