Khai báo và sử dụng hàm là một công việc rất quan trọng trong lập trình. Như bạn đã biết, thực tế không ai viết một chương trình dài một lèo tới hàng chục trang cả (tất nhiên mình không đề cập tới những dạng chương trình kiểu bài tập như Hello World nhé ^^). Chưa kể là cũng sẽ chẳng có ai lại tốn thời gian chỉ để viết đi viết lại một đoạn code nhằm thực hiện cùng một chức năng nào đó tại nhiều nơi cả. Vì lẽ đó mà chúng ta cần phải tìm hiểu cách thức khai báo và sử dụng hàm trong swift.
Hàm là gì ?
Trước tiên, chúng ta cần nắm lại một vài khái niệm về hàm đã nhé.
- Hàm là một khối lệnh được xây dựng để thực hiện một chức năng cụ thể nào đó.
- Hàm luôn luôn được xác định bởi một tên gọi cụ thể. Mọi thao tác với hàm đều sẽ được thực hiện thông qua tên gọi này. Ở đây là hàm chính qui nhé, sẽ có những loại hàm không có tên mình sẽ đề cập sau.
- Thông thường, chúng ta sẽ có 2 dạng cơ bản:
- Hàm: sau khi thực hiện một chức năng cụ thể, hàm trả ra bên ngoài một giá trị nào đó.
- Thủ tục: là một trường hợp của hàm sau khi thực hiện một chức năng cụ thể, thủ tục không trả ra bên ngoài bất kỳ giá trị nào.
Trên đây là một vài khái niệm cơ bản về hàm mà bạn cần nhớ. Khái niệm theo sách vở thì lằng nhằng lắm mà mình không đi sâu vào những tiểu tiết như thế. Vì vậy phần này bạn chỉ cần nhớ những ý chính như vậy là đủ.
Khai báo và sử dụng hàm
Khai báo hàm
Để khai báo hàm trong Swift, bạn cần lưu ý cú pháp như sau:
Bạn lưu ý chỗ này nhé, trong Swift thì trước tên hàm phải có từ khoá func. Điểm này sẽ hơi khác biệt đối với những bạn nào đã quen với C, C# hoặc Java. Để nắm rõ hơn thì bạn hãy thử xem ví dụ sau:
Trong ví dụ trên, mình khai báo một hàm có tên là findMax. Hàm này có chức năng tìm số lớn nhất giữa 02 số nguyên a và b là tham số được truyền vào. Kết quả của hàm này là một số nguyên được trả ra bên ngoài. Trong thân hàm, mình sử dụng toán tử điều kiện (Bài 5 – Toán tử) để thực hiện tìm số lớn nhất.
Tới đây bạn đã nắm được phương pháp khai báo hàm chưa? Cũng không khó và không khác biệt nhiều lắm so với các ngôn ngữ khác phải không nào. Trước khi đi tiếp, mình hy vọng là bạn nắm được phần này đã nhé.
OK, vậy thì sau khi khai báo hàm rồi thì gọi sử dụng nó như thế nào?
Sử dụng hàm
Để gọi sử dụng một hàm hoặc thủ tục nào đó, bạn cần tuân thủ theo cú pháp sau:
Việc gọi hàm chỉ đơn giản là chỉ định ra tên hàm mà chúng ta muốn sử dụng. Bạn cần nhớ là nếu hàm có tham số đầu vào thì phải truyền đủ và đúng nhé. Cụ thể là đủ số lượng tham số và đúng kiểu dữ liệu của mỗi tham số. Bên cạnh đó nếu hàm có trả dữ liệu ra ngoài thì bạn cũng cần khai báo một biến nào đó để nhận dữ liệu. Thông thường việc gọi sử dụng hàm sẽ theo 02 cách thức thế này:
- Ví dụ 1: gọi hàm theo cách thông thường.
- Ví dụ 2: Sử dụng trực tiếp như một tham số đầu vào của hàm khác.
02 ví dụ trên mình đã áp dụng luôn hàm findMax để trình bày. Trong cả 02 ví dụ, mình đều dùng hàm findMax để tìm số lớn nhất giữa 02 số a và b, nhưng:
- Trong ví dụ 1, chúng ta khai báo một hằng max để nhận giá trị trả ra. Hằng max này sẽ chứa giá trị lớn nhất là kết quả thực thi của hàm findMax.
- Trong ví dụ 2, chúng ta sẽ không khai báo một biến / hằng nào để nhận giá trị cả. Vì đơn giản là chúng ta sẽ in trực tiếp kết quả ra màn hình. Lúc này hàm findMax được xem là tham số đầu vào của hàm print, kết quả thực thi của hàm findMax sẽ được hàm print tiếp nhận và xử lý.
Bạn thấy không, việc khai báo và sử dụng hàm trong Swift cũng rất đơn giản phải không nào? Nhưng chưa xong đâu nhé, Swift còn hỗ trợ chúng ta nhiều thứ mới mẻ nữa đó. Bạn hãy cùng mình khám phá tiếp xem nhé.
Hàm trả về nhiều giá trị
Đây chính là một trong những thứ mới mẻ mà mình đề cập đó bạn. Trong Swift hỗ trợ chúng ta trả về cùng lúc nhiều giá trị ra bên ngoài. Đây là điểm khác biệt mà các ngôn ngữ khác không hỗ trợ. Thường thì trong các ngôn ngữ khác chúng ta sẽ dùng các thủ thuật như truyền tham chiếu cho các tham số đầu vào, dùng nhiều biến toàn cục hoặc trả ra một mảng,… Nhưng Swift thì khác, trả ra bên ngoài nhiều giá trị một cách chính qui hẳn hoi đó nhé.
Bạn hãy xét ví dụ sau để biết cách thực hiện:
Ở đây mình khai báo một hàm có tên là findMinMax. Hàm này có chức năng tìm giá trị nhỏ nhất và giá trị lớn nhất của hai tham số a và b truyền vào. Rõ ràng hàm này cần cùng 1 lúc trả ra 02 kết quả là giá trị nhỏ nhất và lớn nhất phải không nào? Vậy thì bạn để ý phần mình highlight ở ví dụ trên nhé, đó là cách mà mình trả ra ngoài 02 giá trị cùng lúc đó.
Đến đây bạn có thấy chỗ này quen không? Mình tiết lộ luôn nhé, đó chính là kiểu dữ liệu Tuple đó bạn ạ. “À” … có bạn nào thốt lên như vậy không? Đến đây thì mình không cần giải thích gì thêm nữa nhé vì mình tin là bạn đã hiểu ra vấn đề. Còn nếu vẫn chưa hiểu thì bạn hãy xem lại bài viết đó nếu đã lỡ quên.
OK, sau khi khai báo hàm, thì việc gọi và nhận nhiều giá trị trả về như thế nào? Và đây chính là cách:
Rất đơn giản phải không nào? Nhờ đặc điểm mới này mà chúng ta sẽ nhẹ nhàng hơn trong việc khai thác hàm. Bạn nên tận dụng điểm này nhé.
Các dạng tham số đầu vào
Về cơ bản thì những gì mình đã trình bày ở trên là tạm ổn để bạn có thể sử dụng hàm. Nhưng chúng ta đang học Swift thì cần tìm hiểu sâu hơn một xíu nhé. Và ở đây mình sẽ cung cấp thêm cho bạn một vài kiểu truyền tham số đầu vào.
- Trong phần trên mình đã trình bày rằng: “để truyền giá trị cho tham số của một hàm thì chúng ta truyền giá trị thông qua tên tham số“. Nhưng đôi khi bạn không muốn gọi tên tham số mà truyền giá trị trực tiếp vào hàm thì sao? Lúc này chúng ta thêm dấu “_” trước tên tham số, cách thức như sau:
- Bên cạnh đó, chúng ta cũng có thể thiết lập giá trị mặc định cho tham số. Những tham số được thiết lập giá trị mặc định thì được phép bỏ khuyết khi gọi hàm. Lúc này tham số sẽ tự lấy giá trị đã được thiết lập mặc định để sử dụng trong thân hàm.
Tham số Variadic
Đây là một dạng truyền tham số cũng khá hay mà mình muốn giới thiệu tới bạn. Tham số Variadic, là dạng tham số cho phép chúng ta truyền không giới hạn số lượng tham số đầu vào (hoặc không có tham số) trong trường hợp không xác định trước được có bao nhiêu tham số đầu vào của hàm.
Để truyền tham số Variadic, chúng ta sẽ thêm dấu “…” sau kiểu dữ liệu của tham số. Bạn hãy xem thử ví dụ sau nhé:
Trong ví dụ trên, mình khai báo một tham số có tên là numbers. Bạn hãy để ý đằng sau kiểu dữ liệu của tham số number này nhé, có dấu “…” đi kèm. Đây chính là tham số Variadic đó bạn, tham số numbers này có khả năng chứa một tập các giá trị số nguyên (cũng gần tương tự mảng). Cũng dễ hiểu phải không nào, và đây là cách để chúng ta có thể truyền tham số variadic:
Tham số in-out
Tham số In-Out là tham số cho phép giá trị của tham số được giữ nguyên (nếu có thay đổi trong quá trình thực thi hàm) sau khi ra ngoài hàm (tương tự truyền tham chiếu). Dạng tham số này thì không có gì mới cả, cũng tương tự như các ngôn ngữ khác mà thôi. Nhưng chúng ta hãy thử điểm qua lại một xíu bằng ví dụ sau nhé:
Ví dụ này có lẽ là kinh điển cho việc truyền tham chiếu. Mình tin rằng nếu ai đã từng học qua bất kỳ 1 ngôn ngữ nào rồi thì cũng đều sẽ hiểu được ví dụ trên phải không nào?
Tổng kết
Phần này mình đã trình bày tới các bạn cách thức khai báo và sử dụng hàm trong Swift. Cũng không có gì khác biệt lắm so với các ngôn ngữ thông dụng khác các bạn nhỉ. Nôi dung phần tiếp theo mình sẽ trình bày sâu hơn một xíu về hàm, nhưng trước hết các bạn cần nắm vững phần này đã. Nếu có gì thắc mắc cần trao đổi thì các bạn hãy comment bên dưới để cùng thảo luận nhé.