【Swift/SwiftUI】関数内で関数(ネスト関数)を定義する方法
- 2025.03.16
- Swift基礎
本記事では関数の中で更に関数を定義し、使用する方法から関数の中で関数を定義することによるメリットデメリットをご紹介していきます。
また、関数の定義方法については以下の記事でご紹介していますので、こちらも参考にしてみてください。
関数内での関数定義とは
一般的に関数は特定の処理の集合体で、メインで実行されている処理内から呼び出されたり、並列で定義されお互いに呼び出し合うという方法で使用されます。
swiftでは、関数の処理の内部で新たに関数を宣言することができます。
内部で宣言した関数はネスト関数と呼ばれ、定義した関数内でのみ使用可能な専用の関数になります。
定義した関数内では自由に呼び出すことができますが、親の関数の外側や他の関数内からは呼び出すことができませんので、ローカル変数に非常に似たような扱いであることが特徴です。
ネスト関数を定義する
実際に関数内でネスト関数を定義していきます。
以下のコードでは、時給から年収を計算して返却する関数(getOneYearSalary)を定義し、その中で時給から日給を計算する関数(calcSalaryOneDay)、日給から年収を計算する関数(calcSalaryOneYear)を定義しています。
var oneHourSalary = 1000;
var oneYearSalary = getOneYearSalary(oneHourSalary: oneHourSalary)
print(oneYearSalary)
//時給から日給と年収を計算
func getOneYearSalary(oneHourSalary : Int) -> Int{
var OneMonthsalary = 0
var OneYearsalary = 0
//日給を計算
func calcSalaryOneDay() -> Int{
return oneHourSalary * 8
}
//年収を計算
func calcSalaryOneYear() -> Int{
return OneMonthsalary * 245
}
OneMonthsalary = calcSalaryOneDay()
OneYearsalary = calcSalaryOneYear()
return OneYearsalary;
}
親関数のローカル変数
関数内で定義したそれぞれのネスト関数を呼び出してその戻り値を変数に入れていることが確認できました。また、ネスト関数は自身より前に定義された親関数のローカル変数などを利用可能であるため、ネスト関数の外で定義しているOneMonthsalaryやOneYearsalaryを使用していることが確認できます。
関数の呼び出しタイミング
親の関数、つまりネストされていない関数は定義する場所を考慮する必要はありません。関数を定義する前の行で関数を呼び出したり、後ろから呼び出しても問題ありません。
そして同様にネスト関数の場合も関数を定義したタイミングに関係なく関数の呼び出しが可能という特徴があります。Swiftの古いバージョンでは、宣言後にしかネスト関数の呼び出しができないということもあったようです。扱いとしては変数と同様のものだと考えてもらって大丈夫ですが、関数宣言と呼び出しのタイミングは柔軟であることは覚えておくと良さそうです。
親関数の外からの呼び出し
ネスト関数は親関数の外部からは呼び出しを行うことができません。ネスト関数は親関数の中で専用の処理として使用することを前提とした関数であるため、親関数の外部からは参照することができません。
実際に使用を試みた場合には、関数がスコープ内で未定義であるというエラーが表示されてしまいますのでご注意ください。
func getOneYearSalary(oneHourSalary : Int) -> Int{
var OneMonthsalary = 0
....
func calcSalaryOneDay() -> Int{
return oneHourSalary * 8
}
...
//親関数内での呼び出しは可能
OneMonthsalary = calcSalaryOneDay()
return OneYearsalary;
}
//関数の外からは呼び出せない
var testOneMonthsalary = calcSalaryOneDay() //Cannot find 'calcSalaryOneDay' in scope
最後に
本記事では関数内に関数を宣言するネスト関数について解説してきました。
他にもSwiftの関数の宣言方法や関数に変数の参照を引数として渡す方法についても解説する記事を書いていますのでそちらもご覧ください。
-
前の記事
【Swift/SwiftUI】関数のinout引数で変数の参照を渡す方法 2025.03.11
-
次の記事
【Swift/SwiftUI】関数の戻り値をタプル型へ 2025.03.24