English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、関数オーバーロードについて学び、関数オーバーロードが必要な場合や、どのようにオーバーロードするかの例について説明します。
が異なる引数を持つ二つ以上の同じ名前の関数重载関数と呼ばれます。
シューティングゲームを開発していると想像してみてください、プレイヤーは刀、ナイフ、銃で敵を攻撃できます。攻撃機能の解決策として、操作を関数として定義するかもしれません:
func attack() { //.. print("刀で攻撃") } func attack() { //.. print("剣で攻撃") } func attack() { //.. print("銃で攻撃") }
しかし、上記のプログラムを実行しようとすると、Swiftでコンパイル時エラーが発生します: 'attack()' はここで既に宣言されていますしかし、別の解決策として、特定の機能に対して異なる関数名を定義することも可能です:
struct Knife { } struct Gun { } struct Blade { } func attackUsingKnife(weapon: Knife) { //.. print("刀で攻撃") } func attackUsingBlade(weapon: Blade) { //.. print("剣で攻撃") } func attackUsingGun(weapon: Gun) { //.. print("銃で攻撃") }
structが何か知らなくても心配しないでください。今はプログラミングで物理的なオブジェクトを作成するものとして考えてください、そうすれば、刀、銃、剣を作成していることになります。
この解決策の唯一の問題は、特定の攻撃操作を呼び出すために関数名を覚える必要があることです。同様に、レベルが上がるにつれて、プレイヤーは手榴弾、ハンドグレネード、リボルバーなどで攻撃する他の機能を持つ可能性があります。
関数名を作成するのは時間がかかり、関数名を覚えるために必要なコストが増えます。要するに、これは直感的ではありません。
それぞれの武器に対して同じ名前で関数を作成できるなら、もっと良いでしょう。そうすれば、関数名を一つ覚えれば十分で、他の武器の関数名を心配する必要はありません。
私たちが先ほど説明したプロセスは関数オーバーロードと呼ばれます。定義によると、同じ名前の関数を二つ以上作成し、引数の数や型が異なるプロセスを関数オーバーロードと呼びます。
以下の例を見てみましょう:
struct Knife { } struct Gun { } struct Blade { } func attack(with weapon: Knife) { print("刀で攻撃") } func attack(with weapon: Gun) { print("銃で攻撃") } func attack(with weapon: Blade) { print("剣で攻撃") } attack(with: Gun()) attack(with: Blade()) attack(with: Knife())
上記のプログラムを実行すると、出力は以下のようになります:
銃で攻撃 剣で攻撃 ナイフで攻撃
上記のプログラムでは、同じ名前の異なるパラメータタイプを持つ関数attackが3つ作成されています。しかし、異なるパラメータタイプを受け取ります。これにより、attack名前だけで関数を呼び出すことができます。
attack(with: Gun()) を呼び出すと、関数内の func attack(with weapon:Gun) ステートメントがトリガーされます。
attack(with: Blade()) を呼び出すと、関数内の func attack(with weapon:Blade) ステートメントがトリガーされます。
attack(with: Knife()) を呼び出すと、関数内の func attack(with weapon:Knife) ステートメントがトリガーされます。
func output(x:Int) { print("intの値は \(x)") } func output(x:String) { print("文字列の値は \(x)") } output(x: 2) output(x: "Swift")
上記のプログラムを実行すると、出力は以下のようになります:
intの値は 2 文字列の値は Swift
上記のプログラムでは、同じ名前と同じ数の引数を持つ関数output()が2つあります。しかし、最初のoutput()関数は整数を引数として受け取り、第二のoutput()関数はString引数を取ります。
例と、1同様に、
output(x: 2) は、関数内の func output(x:Int) ステートメントをトリガーします。
output(x: "Swift") を呼び出すと、関数内の func output(x:String) ステートメントがトリガーされます。
func output() { print("おはようございます!") } func output(text:String) { print(text) } func output(text:String, num:Int) { print("\(text)\(num)!") } output() output(text: "こんばんは!") output(text1: "Good N", num: 8)
上記のプログラムを実行すると、出力は以下のようになります:
おはようございます! こんばんは! Good Night!
上記のプログラムでは、output()関数が引数の数に応じてオーバーロードされています。
最初のoutput()は引数なし、次のoutput()は1つの引数Stringを持つ、そして3つ目のoutput()は2つの引数StringとIntを持つ:
パラメータ名を変更してオーバーロードを試み、パラメータタグを変更せずに以下のように行います:
func output(value text:String) { print(text) } func output(value num:Int) { print(num) } output(value: 2) output(value: "Hello")
上記のプログラムを実行すると、出力は以下のようになります:
2 Hello
ご覧の通り、上記のプログラムでは、オーバーロードされた関数には同じ引数タグを使用できます。しかし、オーバーロードの要件に従って、異なる数の引数または異なるタイプの引数を持たなければなりません。