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

プログラミングにおいて基本中の基本のメソッドだけど「分かったようで意外と分かっていない」、「ノリでやってる」という人も多いんじゃないかな?たった3つの概念をしっかり押さえておけば、メソッドは理解できるはずだよ

メソッドに登場する3つの概念

メソッドを理解する上で必要な概念は次の三つしかないよ

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

この中でも特に大事なのが引数返り値だよ。まずはこの二つについて説明を始める前に1の「メソッドの定義と呼び出し」について簡単に解説しておくよ。

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

例えばこんなスクリプトがあったとするよ。

func hello() {  
   print("HelloWorld")  
}  
//実行結果: なし  

このスクリプトを実行しても何も起きないよ。なぜかというとメソッドは定義するだけではなく、呼び出すことで初めて実行されるものだからだよ

func hello() {  
   print("HelloWorld")  
}  
hello()  //メソッドを呼び出している  
//実行結果: "HelloWorld"  

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

という事で本題に入るよ。定義と呼び出しについて理解してもらったところで、ここからは引数と返り値の説明をしていくよ。
そもそも引数と返り値はある場合とない場合があるよ。そこで引数と返り値の役割を理解するために、次の4つのメソッドのサンプルを順番に紹介するよ。段階を追った形で理解しやすいはずだよ。

A. 引数のみのメソッド
B. 返り値のみのメソッド
C. 引数も返り値もないメソッド
D. 引数・返り値の両方があるメソッド

パターンA. 引数があるメソッド

まず初めに引数があるメソッドを見てみるよ。

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

ここで注目して欲しいのがカッコの中身。ここが引数を表している部分になるよ。

(words: String)  

そもそも引数は引数名引数型で構成されているよ。そして今回の場合、引数名と引数型は下の通りとなるよ

  • words引数名
  • words引数型String

つまり「wordsという引数にはString型の値しか渡すことができない」ということになるよ

・メソッドの呼び出し

それを踏まえてメソッドの呼び出しを見てみよう。呼び出し時に引数wordsに文字列"やーい"を渡していることがわかるよ。また、先ほど述べた通り引数wordsにはString以外の値は渡せないよ。

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

パターンB. 返り値のみがあるメソッド

続いて返り値があるメソッドを見てみよう

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

ここで注目して欲しいのがreturn "ピカー"の部分で、これは"ピカー"という文字列をreturn(返却)しているよ。さらに-> Stringの部分にも注目して欲しいよ

  • -> String返り値型
  • 文字列"ピカー"返り値

返り値は返り値型と一致している必要があるよ。ダメな例をあげるとこうなるよ

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

・呼び出し

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

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

これは一番シンプルな形とも言えるかもしれない。このhelloというメソッドに引数・返り値はないよ。

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

()に違和感を感じる人もいたと思うけど、この理由は引数が存在しないからだよ

・呼び出し

そしてこのメソッドを呼び出すときはこう呼び出すよ

hello() //実行結果: "こんにちは"  

まぁ簡単だね

パターンD 引数・返り値の両方があるメソッド

続いて引数と返り値の両方があるメソッドを見てみるよ。A~Cを組み合わせれば、次のメソッドも何をやっているか理解できるはずだよ。

func countCharacters(characters: String) -> Int {  
     return characters.count  
}  
print(countCharacters(characters: "ああああ")) //実行結果: 4  

補足

補足1: 引数名を省略するケース

引数を_をつけることで

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

呼び出しの際、引数を明示的に宣言せずともメソッドに値を渡すことができる。

print(countCharacters("ああああ")) //実行結果: 4  

補足2: 引数が複数個存在するケース

applesbasketsの二つが引数として存在している。

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

まとめ

最後に今まで書いてきたことをまとめて終わりにします

  • メソッドは定義するだけでなく、それを呼び出す事で初めて実行される。
  • 引数返り値はある場合とない場合がある。
  • returnで返却される返り値の型はメソッドの宣言時に定義される「返り値型」と一致している必要がある
  • 同様に、引数に渡される値はその引数型と一致している必要がある
  • 引数は複数個あったり、省略して呼び出したりもできる

最後までご覧いただきありがとうございました

こっちは真面目に作ってます。笑

サクっとプログラミング

iOSアプリ開発のあれこれがまとまるwebサイト