1-5 関数の基本的な定義と呼び出し

関数は、プログラミング言語で重要な概念であり、再利用可能なコードブロックを定義します。
プログラム内で特定のタスクを実行するための手続きや操作を表すものです。

人によっては、関数のことを、メソッドと呼ぶ人もいます。さらには、ファンクションと呼ぶ人もいます。

再利用可能って、プログラミングにおいて、とても大事な考え方です。

こっちでも、あっちでも同じ処理を実行している!そんな時は、関数を作って、処理を共通化してみましょう。

作った関数を、いろいろな場所で使用する。これが、「再利用」です。

私もよく、先輩から「ここ共通化して!」とか「ここと、ここ、同じことやってるから関数に切り出して!」てな感じに言われます。

関数の定義

Swiftでは、関数は以下のようにして定義されます。

func 関数名() -> 返す値の型 {
		return 返す値
}

関数は、定義するだけでは、なんの意味もありません。

実行」してあげて初めて、役目を果たします。

関数は、以下のように実行します。

関数名()

では、実際に動くプログラムを書いていきましょう。

是非、実際に操作しながら学んでいきましょう。
以下でSwiftのブラウザ実行環境が使えます。 print()で出力される文字を確認してみましょう。

https://paiza.io/ja/projects/new

以下のgetFruit関数は、String型の値を返すメソッドです。
実行すると、”Apple”という値が返されます。

// 関数を定義する
func getFruit() -> String {
    return "Apple"
}

// 関数を実行し、fruitという変数にreturnされた値をぶち込む
let fruit = getFruit()
print(fruit) // Apple

void型(ボイド型)

関数は、値を返すことは必須ではありません。
値を返さない関数の戻り値は、Void型 という値を返さない型を指定します。

// 関数を定義する
func getFruit() -> Void {
    print("Apple") // return しない
}

// 関数の処理の中でprintしているので、実行するだけで"Apple"とログ出力される
getFruit() // Apple

また、このVoidは、省略して書くことができます。

// 戻り値を指定せずに、関数を定義する
func getFruit() {
    print("Apple")
}

// 関数の処理の中でprintしているので、実行するだけで"Apple"とログ出力される
getFruit() // Apple

引数(ひきすう)

関数は、引数を取ることができます。

func 関数名(引数の名前: 引数の型) {
    // 実行する処理
}

// 関数を実行する
関数名(引数の名前: 引数そのもの)
// fruitという名前の、String型の引数が必要な関数を定義する
func getFruit(fruit: String) {
    print(fruit)
}

// fruituという名前の引数に、文字列appleを指定して関数を実行する
getFruit(fruit: "apple") // apple

引数の名前(引数ラベルとかって呼ばれます)は、省略することができ、よりシンプルに関数を定義することができます。

以下のように、関数を定義する際に、_(アンダーバー)を指定することで、
関数を実行するさいに、引数ラベルを指定しないでも関数を実行することができます。

// 引数にアンダーバーを指定して、シンプルに関数を実行できるようにする
func getFruit(_ fruit: String) {
    print(fruit)
}

// 引数の名前を指定せずに、引数そのもの のみを持たせて関数を実行する
getFruit("apple") // apple

引数ラベルを指定する関数と、引数ラベルを指定しない関数、どっちを使えばいいの?

例えば、

もし関数内で同じ型の引数が複数ある場合、引数ラベルがないと引数を区別するのが難しくなります。

この場合、引数ラベルを明示的に使ったほうが良いでしょう。

// String型を、二つ引数に持つ関数
func createFullName(firstName: String, lastName: String) -> String {
    return "\(firstName) \(lastName)"
}

// 引数ラベルを指定して関数を実行すると、各引数が何を表してるか分かりやすい!
let fullName = createFullName(firstName: "スティーブ", lastName: "ジョブズ")
print(fullName)  // 結果:  スティーブ ジョブズ

どちらを使うかはプロジェクトのルールや、ぶっちゃけ開発者の好みです。

一応、Swiftでは一般的には引数ラベルを使用することが推奨されているみたいです。

じゃあ、引数の順番は、
定義時と実行時の順番を揃えないでもいいの?

// name → age の順番で定義
func greet(name: String, age: Int) {
    print("\(name), \(age)!")
}

// 関数の呼び出しで、引数を定義時と逆にする
greet(age: 26, name: "RIKO")

それはできないのです。
関数呼び出しの際には、関数の宣言で指定された引数の順番を守る必要があります。
できたらいいのに!!って思います。 (ボヤキ)

// name → age の順番で定義
func greet(name: String, age: Int) {
    print("\(name), \(age)!")
}

// 関数の呼び出しで、引数を定義時と逆にする
greet(age: 26, name: "RIKO") // エラーになる

ドリル

 例1
関数定義-引数ラベル有り
func returnInteger(number: Int) -> Int {
    return number
}
// 関数の呼び出し
let result = returnInteger(number: 26)
print(result) // 26

例2
関数定義-引数ラベル無し
func returnInteger(_ number: Int) -> Int {
    return number
}

// 関数の呼び出し
let result = returnInteger(26)
print(result) // 26