Swift 関数

プログラミングにおいて、ある処理を一まとまりにして名前をつけたものを関数と言います。
今回はSwiftにおける関数についてまとめていきたいと思います。

関数の定義方法

関数はfuncキーワードを用いて以下のように定義します。

func 関数名(引数名1: 引数1の型, 引数名2: 引数2の型, ... ) -> 戻り値の型 {
    関数呼び出しで実行される処理
    return 戻り値 // 戻り値がある場合のみ記述
}

引数とは、関数の処理に渡すことのできるパラメータのことで、任意の数だけ任意の型の引数を定義することができます。
戻り値とは関数を実行した後に返却される値のことです。
戻り値は関数で処理した結果を利用したい時などに設定し、結果は利用せず処理だけを行いたい場合は戻り値なしの関数を定義することもできます。

関数の実行方法

関数は定義しただけでは何も実行されません。
関数で定義した処理を実行するには呼び出す方法があります。
関数の呼び出しは以下のように行います。

関数名(引数名1: 引数1, 引数名2: 引数2, ...)

関数名の後に()を記述しその中にそれぞれの引数名に対応する引数を指定していくことで実行されます。
関数に戻り値がある場合、以下のように記述することで変数・定数に戻り値の値を代入することができます。

let 定数名 = 関数名(引数名1: 引数1, 引数名2: 引数2, ...)

戻り値がない関数の呼び出しで代入を行おうとするとコンパイルエラーになります。
また、型が不一致の代入を行うのもコンパイルエラーになります。

関数の定義と実行の例

関数の定義と実行の実装例から見てみましょう。
下記の例では、簡単な計算を行う処理を戻り値のあり、なしで分けて実装しています。
引数や戻り値とはどのようなものかが理解しやすくなると思います。

// 実装例
let number1 = 3
let number2 = 5

// 2つのInt型の値を引数として受け取り、その和を戻り値として返却する関数
func sumTwoNum(num1: Int, num2: Int) -> Int {
    let sum = num1 + num2
    return sum
}

// 2つのInt型の値を引数として受け取り、その積を計算し出力する関数(戻り値はなし) 
func printMultiplicationTwoNum(num1: Int, num2: Int) {
    let multiple = num1 * num2
    print(multiple)
}

// sumTwoNumにnumber1とnumber2を引数で渡して実行し、戻り値をnumber3に代入
let number3 = sumTwoNum(num1: number1, num2: number2)
print(number3)
// >>> 8

// printMultiplicationTwoNumにnumber1とnumber2を引数で渡して実行
printMultiplicationTwoNum(num1: number1, num2: number2)
// >>> 15

引数いろいろ

外部引数と内部引数

引数名は呼び出し時に使用する外部引数と、関数の処理内で使用する内部引数に分けることができます。
外部引数と内部引数を分けるためには以下のように定義します。

func 関数名(外部引数名1 内部引数名1: 引数1の型, 外部引数名2 内部引数名2: 引数2の型 ... ) {
    処理
}

利用例は以下のとおりです。

// 利用例
func printUserFullName(userFirstName mei: String, userLastName sei: String) {
    print("このユーザのフルネームは\(sei + mei)です")
    print("This user's full name is \(mei + sei)")
}

let firstName = "Taro"
let lastName = "Tanaka"

printUserFullName(userFirstName: firstName, userLastName: lastName)

// >>> このユーザのフルネームはTanakaTaroです
// >>> This user's full name is TaroTanaka

外部引数名は”_”とすることで省略することができます。
外部引数名を省略した場合、呼び出しの際は引数名を記述する必要はなく引数に渡す順番でどちらの引数に代入されるかが決まります。

func sum(_ num1: Int, _ num2: Int) -> Int {
    return num1 + num2
}

let sumNum = sum(1, 2)
print(sumNum)

// >>> 3

デフォルト引数

デフォルト引数とは、デフォルト値を持った引数のことです。
デフォルト引数の設定は以下のように行います。

func 関数名(引数名1: 引数1の型 = 引数1のデフォルト値, 引数名2: 引数2の型 = 引数2のデフォルト値 ... ) {
    処理
}

デフォルト引数は必ずしも引数を渡す必要がありません。
引数が設定されている場合は設定された値となり、設定されていない場合はデフォルト値となります。

func greeting(greet: String = "Hello", name: String) {
    print("\(greet), \(name)!")
}

greeting(name: "Toro")
greeting(greet: "こんにちは", name: "太郎")

// >>> Hello, Toro!
// >>> こんにちは, 太郎!

インアウト引数

インアウト引数とは、引数として渡された変数に対する変更を関数外でも反映させることができる引数です。
インアウト引数はinoutキーワードを使って以下のように記述します。
また、呼び出し時は引数の前に&を付けます。

func 関数名(引数名1: inout 引数1の型, 引数名2: inout 引数2の型 ... ) {
    処理
}

// 呼び出し時
関数名(引数名1: &引数, 引数名2: &引数2 ... )

利用例としては以下のとおりです。
引数として渡した変数を変更する必要がある場合に利用します。
ちなみに、インアウト引数でない引数は定数となるため変更できません。

var name = ""

func inoutChangeName(inputName: inout String, changeName: String) {
    inputName = changeName
    print("name in func is \"\(inputName)\".")
}

print("name before func is \"\(name)\".")
inoutChangeName(inputName: &name, changeName: "Yuki")
print("name after func is \"\(name)\".")

// >>> name before func is "".
// >>> name in func is "Yuki".
// >>> name after func is "Yuki".

func notInoutChangeName(inputName: String, changeName: String) {
    inputName = changeName // inout引数ではない引数は定数のためコンパイルエラー
}

可変長引数

可変長引数とは任意の個数の値を受け取ることができる引数です。
可変長引数は関数内で配列に変換されて利用されます。
可変長引数は以下のように記述します。

func 関数名(引数名: 引数の型...) {
    処理
}

// 呼び出し時
関数名(引数名: 引数1, 引数2, 引数3 .... )

普通の引数の型を配列にすることによっても複数の値を渡すことができますが、可変長引数には事前に配列にする必要がないことや呼び出し側に配列を意識させることがないという利点があります。

func sumAllNumber(someNumber: Int...) -> Int {
    var sumNumber = 0
    for num in someNumber {
        sumNumber += num
    }
    return sumNumber
}

let sumNumber = sumAllNumber(someNumber: 1, 2, 3, 4, 5)
print(sumNumber)
// >>> 15

まとめ

  • 関数とは処理を一まとまりにして呼び出せるようにしたもの
  • 関数には引数というパラメータを設定することができる
  • 何らかの結果を返却したい場合は戻り値を設定することができる

関数を利用することで処理の抽象化を行うことができコードの可読性が高まります。
また、同一の処理を関数で共通化することができ記述量も減らすことができます。
関数の使い方をしっかり覚えて上手に利用して綺麗なコードを書けるようにしていきましょう。
ここまで読んでいただきありがとうございました。
それでは、また。