Nạp chồng hàm Swift (Có ví dụ)

Trong bài viết này, bạn sẽ tìm hiểu về quá tải hàm, khi nào chúng ta cần nạp chồng hàm và cách nạp chồng bằng các ví dụ.

Hai hoặc nhiều hàm có cùng tên nhưng (các) đối số khác nhau được gọi là hàm nạp chồng.

Tại sao chúng ta cần quá tải hàm?

Hãy tưởng tượng bạn đang phát triển một trò chơi bắn súng trong đó người chơi có thể tấn công kẻ thù của mình bằng dao, lưỡi kiếm và súng. Giải pháp của bạn cho chức năng tấn công có thể là xác định các hành động thành các chức năng như:

 func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") ) 

Nhưng khi bạn cố gắng chạy chương trình trên, bạn sẽ gặp lỗi thời gian biên dịch trong Swift là 'attack ()' được khai báo trước đó ở đây . Tuy nhiên, một giải pháp khác có thể xác định các tên chức năng khác nhau cho chức năng cụ thể như:

 struct Knife ( ) struct Gun ( ) struct Blade ( ) func attackUsingKnife(weapon:Knife) ( //… print("Attacking with Knife") ) func attackUsingBlade(weapon:Blade) ( //… print("Attacking with Blade") ) func attackUsingGun(weapon:Gun) ( //… print("Attacking with Gun") ) 

Đừng lo lắng nếu bạn không biết struct là gì. Bây giờ, hãy nghĩ về nó như một thứ tạo ra một đối tượng vật lý trong lập trình, vì vậy bạn đang tạo ra một con dao, súng và lưỡi dao. Nếu bạn muốn biết thêm, hãy xem Swift Struct. Nếu không, chúng ta sẽ quay lại với nó trong các chương sau.

Vấn đề duy nhất với giải pháp này là bạn cần nhớ tên hàm để gọi hành động tấn công cụ thể đó. Ngoài ra khi cấp độ tăng lên, người chơi có thể có các tính năng bổ sung để tấn công bằng bom, lựu đạn, súng ngắn, v.v.

Việc tạo hàm với các tên khác nhau sẽ tốn thời gian và tăng chi phí ghi nhớ tên hàm để gọi nó. Nói chung, nó không trực quan.

Sẽ tốt hơn nhiều nếu bạn có thể tạo các chức năng khác nhau có cùng tên nhưng cách thực hiện khác nhau cho từng loại vũ khí. Bằng cách này, chỉ cần nhớ một tên chức năng là đủ và bạn sẽ không phải lo lắng về tên chức năng cho các vũ khí khác.

Quá tải hàm là gì?

Quá trình chúng ta vừa mô tả được gọi là quá trình nạp chồng hàm. Theo định nghĩa, quá trình tạo hai hoặc nhiều hơn hai hàm có cùng tên nhưng có số lượng hoặc kiểu tham số khác nhau được truyền vào được gọi là quá trình nạp chồng hàm.

Hãy xem điều này trong ví dụ dưới đây:

Ví dụ 1: Nạp chồng hàm

 struct Knife ( ) struct Gun ( ) struct Blade ( ) func attack(with weapon:Knife) ( print("Attacking with Knife") ) func attack(with weapon:Gun) ( print("Attacking with Gun") ) func attack(with weapon:Blade) ( print("Attacking with Blade") ) attack(with: Gun()) attack(with: Blade()) attack(with: Knife()) 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

 Tấn công bằng súng Tấn công bằng lưỡi Tấn công bằng dao 

Trong chương trình trên, chúng ta đã tạo ba hàm khác nhau có cùng tên attack. Tuy nhiên, nó chấp nhận các kiểu tham số khác nhau. Bằng cách này, nhớ attacktên để gọi hàm là đủ.

  • Lời gọi attack(with: Gun())kích hoạt câu lệnh bên trong hàm func attack(with weapon:Gun).
  • Lời gọi attack(with: Blade())kích hoạt câu lệnh bên trong hàm func attack(with weapon:Blade).
  • Câu attack(with: Knife())lệnh gọi bên trong hàm func attack(with weapon:Knife).

Ví dụ 2: Nạp chồng hàm dựa trên các kiểu tham số khác nhau

 func output(x:Int) ( print("The int value is (x)") ) func output(x:String) ( print("The string value is (x)") ) output(x: 2) output(x: "Swift") 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

 Giá trị int là 2 Giá trị chuỗi là Swift 

Trong chương trình trên, chúng ta có hai hàm trùng tên output()và cùng số lượng tham số. Tuy nhiên, output()hàm đầu tiên nhận một số nguyên làm tham số và output()hàm thứ hai nhận Stringmột tham số.

Tương tự như Ví dụ 1,

  • lệnh gọi để output(x: 2)kích hoạt câu lệnh bên trong hàm func output(x:Int)
  • lệnh gọi để output(x: "Swift")kích hoạt câu lệnh bên trong hàm func output(x:String).

Ví dụ 3: Nạp chồng hàm dựa trên số lượng tham số khác nhau

 func output() ( print("Good Morning!") ) func output(text:String) ( print(text) ) func output(text:String, num:Int) ( print("(text)(num)!") ) output() output(text: "Good Evening!") output(text1: "Good N", num: 8) 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

Buổi sáng tốt lành! Chào buổi tối! Chúc ngủ ngon!

Trong chương trình trên, hàm output()đã được nạp chồng dựa trên số lượng đối số.

Đầu tiên output()không có tham số, thứ hai output()nhận một tham số duy nhất: Stringvà thứ ba output()nhận hai tham số: StringInt.

Hãy thử quá tải bằng cách thay đổi tên tham số nhưng giữ nguyên nhãn đối số như:

Ví dụ 4: Nạp chồng hàm với cùng một nhãn đối số

 func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello") 

Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:

 2 xin chào

Như bạn thấy, trong chương trình trên, bạn có thể sử dụng cùng một nhãn đối số cho các hàm được nạp chồng. Tuy nhiên, vì yêu cầu quá tải, bạn phải có số lượng tham số khác nhau hoặc các loại tham số khác nhau.

thú vị bài viết...