swift

「メソッド」を完全に理解するための3つの概念【Swift】

メソッドはなんなくあやふやな理解のまま放置されがちですが、抑えておくべきは「定義と呼び出し」・「引数」・「返り値」この3点だけです!!

メソッドで必要となる3つの概念

メソッドを理解する上で必要な概念としては次の三つです。

  1. 定義と呼び出し
  2. 引数
  3. 返り値

特に大事なのが「引数」と「返り値」です。順番に説明していきます。

1. メソッドの定義と呼び出し

まず、メソッドはfuncで定義することができます。例えばこんなメソッドがあったとします。実行されると”HelloWorld”という文字列がログ出力されるというものです。

func hello() {
   print("HelloWorld")
}

またメソッドは呼び出すことで実行されます。

hello()  //実行結果: "Hello World"

「引数」と「返り値」を理解する

ここまではさほど難しくはないかと思います。ここからは引数と返り値の説明をしていきます。
まず全てのメソッドは必ず次の4つのどれかに分類することができます。

A. 引数も返り値もないメソッド
B. 引数があり、返り値はないメソッド
C. 引数はなく、返り値があるメソッド
D. 引数も返り値もあるメソッド

この4つのパターンを簡単なものから順番に、1つずつ段階を追って説明していきます。

パターンA. 引数も返り値もないメソッド

はじめに引数も返り値もないメソッドをみてみます。これは一番シンプルな形のメソッドと言えます。

func hello() {
    print("こんにちは")
}

このように呼び出します。

hello() //"こんにちは"

パターンB. 引数があり、返り値はないメソッド

続いて引数があるメソッドを見てみます。

func say(words: String) {
    print(words)
}

最初に見たパターンAとの違いは空欄だった()words: Stringと記述されていることです。この部分がメソッドにおける引数を宣言している部分になります。

words: String

こうして()の中身だけを見ると定数・変数定義に似ていませんか??実はそれもそのはずで、引数とはメソッド実行時のみ一時的に利用できる変数のようなものです。ですから変数には変数名と型があるように、引数にも引数名引数型が存在します。そして今回の場合、引数名と引数型はこのようになります。

  • words引数名
  • words引数型String

そして引数があるメソッドの場合、呼び出す際にその引数に対して値を渡す必要があります。つまり、今回の例で言うと引数wordsにはString型の値を渡すことになります。このことを踏まえてどう呼び出すかを見てみます。

say(words: "やーい") //"やーい"
say(words: "おおおお") //"おおおお"
say(words: 1) //1はIntなのでエラー

呼び出し時に引数wordsに文字列"やーい"を渡していることがわかります。また、先ほど述べた通り引数wordsにはString以外の値は渡せません。したがって1を渡すとエラーとなってしまいます。

パターンC. 引数はなく、返り値があるメソッド

続いて引数はなく、返り値があるメソッドを見てみます

func pikachu() -> String {
    return "ピカー"
}

まず、前述の通りこのメソッドに引数はありません。したがって()は空欄になっています。続いて注目して欲しいポイントは次の2つです。どちらも返り値に関係するコードになっています。

  1. -> String
  2. return "ピカー"

まず引数同様、返り値にも返り値型が存在します。そして1.はこの返り値型を定義している部分です。
続いて2.は何かというと、まずreturnは直訳すると「返却」と意味になります。従って"ピカー"という文字列をreturn(返却)しているというわけです。要するに、

  • 返り値型String
  • 返り値"ピカー"

引数や変数と同様、返り値もその返り値型と一致している必要があります。よって次のようなメソッドはエラーとなってしまいます。-> Intで返り値型がIntと指定されている一方で、returnされているのは文字列「“ピカー”」だからです。

func pikachu() -> Int {
    return "ピカー"  //返り値「"ピカー"」はIntじゃないのでエラー
}

今回の例では呼び出すとログとして出力されません。このように実行結果を定数として定義し、printします。

pikachu()  //なし

let pika = pikachu()
print(pika)//実行結果: ピカー

パターンD 引数も返り値もあるメソッド

続いて引数と返り値の両方があるメソッドを見てみます。一見複雑なメソッドに見えるかもしれませんが、パターンBとCの説明を組み合わせれば、次のメソッドも何をやっているか理解できると思います。

func countCharacters(characters: String) -> Int {
     return characters.count
}

まず()の中身を見て宣言された引数を確認しましょう。今回の引数charactersの引数型はStringであることがわかります。characters.countreturnしています。(.countは文字数を取得するメソッドです)

let charaNum = countCharacters(characters: "ああああ")
print(charaNum) //4

つまり呼び出し時にcharactersに渡した文字の文字数が得られるメソッドです。

まとめ

説明は以上です。最後に今まで書いてきたことをまとめて終わりにします。

  • メソッドはfuncで定義でき、定義したメソッドは呼び出される事で初めて実行される。
  • メソッドには引数返り値があり、全てのメソッドはいずれもある場合と無い場合の4つに分類できる。
  • ()内で定義される引数に渡される値は、その引数型と一致している必要がある
  • 引数と同様にreturnで返却される返り値の型はメソッドの宣言時に定義される「返り値型」と一致している必要がある

ありがとうございました!

おまけ いろいろな引数の宣言

2と3は知っていると便利なのでうまく使いこなしましょう。

1. 引数が複数個存在するケース

func countApplesInTheBaskets(apples: Int, baskets: Int) -> Int {
   let numberOfApples = apples * baskets
   return String(numberOfApples) + "個です"
}
print(countApplesInTheBaskets(apples: 5, baskets: 3)) //実行結果: 15個です

applesbasketsの二つが引数として存在している。引数が複数個宣言されることは珍しくない。

2. 呼び出す際に引数名を省略する

func countCharacters(_ characters: String) {
	print(characters.count)
}

引数名を宣言する際に_がついています。すると呼び出しの際、下のように引数名を明示的に宣言せずとも値を渡すことができます。

countCharacters("ああああ") //実行結果: 4
//本来はこう呼び出す→ countCharacters(characters: "ああああ")

3. 引数にデフォルト値を設定する

func countCharacters(characters: String = "デフォルト") {
	print(characters.count)
}

引数の宣言時にまるで変数を定義するが如く=で値を渡します。呼び出し時に値が渡されなかったときに、デフォルトの値として使用されます。

countCharacters() //"デフォルト
countCharacters(characters: "あああああ") //"ああああ"

読んでいただきありがとうございます!!

記事として取り上げたトピックを体系化してまとめた内容を電子書籍として販売しています。購入していただくことで執筆の応援ができます。詳細はこちらから