Trong nội dung bài trước mình đã trình bày tới bạn phương pháp sử dụng hàm. Đó là những nội dung cơ bản về thao tác hàm mà các bạn cần nắm để lập trình. Tuy nhiên hàm không phải chỉ có như vậy mà nó vẫn còn một số khía cạnh nữa sâu hơn cần nhắc tới. Và phần này mình sẽ trình bày tới các bạn function type hay còn gọi là “kiểu hàm”, nhưng bạn đã nắm thật vững nội dung bài trước đã nhé.


Kiểu hàm (Function Type)


Đây là phần mà mình rất thích trong việc sử dụng hàm. Bản thân mình cũng hay áp dụng vì nó sẽ giúp mình code nhẹ nhàng hơn, ngắn gọn hơn. Vậy thì kiểu hàm là gì nhỉ?

Các bạn chú ý nhé, hàm cũng gần như biến / hằng ở chỗ hàm cũng có “kiểu” của riêng nó. Cũng giống như biến / hằng được xác định bởi một kiểu dữ liệu nào đó, thì hàm cũng vậy. Nhưng kiểu hàm được xác định bởi kiểu dữ liệu của các tham số đầu vào và kiểu dữ liệu trả ra của hàm. Hơi khó hiểu phải không các bạn? Thôi thì chúng ta xét thử ví dụ sau cho dễ hiểu nhé.

  • Xét lại ví dụ về hàm findMax đã trình bày ở trên, chúng ta có:

“Kiểu

  • Bạn lưu ý kiểu dữ liệu của tham số đầu vào và kết quả trả ra nhé. Mình phân tích như sau: Hàm findMax ở trên có 2 tham số đầu vào a và b là kiểu số nguyên, đồng thời hàm này cũng return ra một kết quả cũng là số nguyên. Từ phân tích như vậy, chúng xác định được kiểu hàm của hàm findMax có dạng:

“Kiểu

  • (Int, Int) -> Int chính là kiểu hàm của hàm findMax đó các bạn ạ. Các bạn đã hiểu vấn đề chưa nhỉ? Tương tự như vậy, đối với hàm không có kiểu dữ liệu trả về thì chúng ta dùng kiểu Void để thay thế, ví dụ:

“Kiểu
Đến đây bạn đã hiểu kiểu hàm là gì chưa? Giải thích thì hơi lung tung rắc rối, nhưng xem ví dụ thì mọi thứ có vẻ đã rõ ràng hơn rồi phải không.
Việc xác định được kiểu hàm cũng rất quan trọng. Chúng ta sẽ gặp và ứng dụng kiểu hàm này khá thường xuyên đấy bạn ạ. Vậy bạn đã sẵn sàng để đi tiếp chưa? Mình nghĩ là OK rồi nhé, và dưới đây là một vài ứng dụng của kiểu hàm.


Ứng dụng của kiểu hàm


Con trỏ hàm

Trong Swift, chúng ta có thể sử dụng hàm giống như sử dụng một biến / hằng. Do đó, chúng ta có thể thao tác với hàm như thao tác với biến. Phần này chỉ đơn giản vậy thôi, nhưng sẽ cần phải vận dụng kiểu hàm đấy bạn nhé.

Để cho dễ hiểu, chúng ta hãy xét ví dụ như sau:
Con trỏ hàm trong Swift

Tới thời điểm này thì bạn đã có thể tự đọc được ví dụ trên chưa? Mình khai báo hàm findMin để tìm giá trị nhỏ nhất và findMax để tìm gía trị lớn nhất giữa 2 số nguyên ab. Cả 2 hàm đều trả ra kết quả ra ngoài cũng là số nguyên. Từ những ý trên mà chúng ta có thể xác định được là cả 02 hàm này đều có cùng một kiểu, đó là (Int, Int) -> Int.

Điểm hay trong ví dụ này là chúng ta sẽ khai báo một biến mathVariables có kiểu là (Int, Int) -> Int. Các bạn thấy sao? Biến lúc này có kiểu dữ liệu là một kiểu hàm thay vì một kiểu dữ liệu cơ sở. Từ đó chúng ta sẽ thực nghiệm bằng cách gán thử hàm findMax vào biến mathVariables. Sau đó in biến mathVariables ra màn hình, hãy chạy thử đi bạn. Làm tương tự cho hàm findMin nên mình không giải thích thêm nữa nhé.

Lúc này bạn đã thấy kết quả chưa? Rất hay phải không nào. Đây không phải kiến thức mới, bản chất của nó là con trỏ hàm trong C++ đó bạn.

Hàm trả về một hàm

Nhờ “kiểu hàm” mà một hàm cũng có thể xem như một biến / hằng số. Vì vậy mà một hàm trong Swift cũng có thể được trả ra (return) từ một hàm nào đó. Chúng ta xét ví dụ sau nhé:
“KiểuVí dụ trên chỉ đơn giản là khai báo một hàm getMinMax. Hàm này vừa trả về giá trị lớn nhất (nếu tham số isMinfalse), vừa trả về giá trị nhỏ nhất (nếu tham số isMintrue). Các bạn để ý chỗ return nhé, mình return trực tiếp hàm findMin hoặc findMax ra ngoài y như return một biến. Khá hay và cũng đơn giản phải không? Trong ví dụ mình cũng đã chú thích đầy đủ vì thế chắc bạn cũng đã hiểu vấn đề rồi nhỉ.

Xây dựng hàm bên trong một hàm khác

Swift còn cho phép chúng ta xây dựng một hàm bên trong thân của một hàm khác. Thực ra thì nội dung này không liên quan gì lắm tới kiểu hàm. Nhưng đây cũng là một ứng dụng hay của hàm nên mình trình bày luôn.

Nào, giờ thì chúng ta cũng xét thử ví dụ dưới nhé.
“Kiểu

Trong ví dụ trên, mình xây dựng lại 2 hàm findMin và findMax bên trong thân của hàm findMinMax. Sau đó mình sẽ thực hiện return cả 02 hàm này ra bên ngoài. Trong ví dụ này mình có ứng dụng là kiểu Tuple để trả ra 02 giá trị, chắc các bạn không quên bài này phải không nào.


Tổng kết


Những gì cần trình bày về phương pháp sử dụng hàm thì mình đã giới thiệu tới các bạn qua 02 bài học (bài 8 và bài này). Mình hy vọng rằng những kiến thức này sẽ giúp ích được cho các bạn ít nhiều trong việc tìm hiểu ngôn ngữ Swift. Thực ra thì cũng chưa hoàn toàn hết hẳn, vẫn còn một phần nữa ứng dụng tới kiểu hàm. Nhưng phần này mình sẽ trình bày riêng ở bài kế tiếp do nó là một lĩnh vực khác. Các bạn theo dõi nhé.

0 0 votes
Đánh giá bài viết
0 Góp ý
Inline Feedbacks
View all comments