関数とクロージャ
いつまでたっても関数を引数で呼ぶという作業をするときに手が止まってしまう長期インターン生です。
作業をしている最中に引数の扱い方が分からなくなったことが何度もある。
そこで、また手が止まってしまった時のためにキータにあげておこうとおもいます。
投稿する内容が教科書レベルなことばかりで恥ずかしい。
処理の再利用
- 関数とクロージャはひとまとまりの処理を切り出し、再利用可能とするためのもの。
- 関数やクロージャは任意のタイミングで実行できるので、重複した処理を1箇所にまとめ、可読性やメンテナンス性を高めることが出来る。
関数
名前を持ったひとまとまりの処理
定義方法
func 関数名(引数名1: 型, 引数名1: 型) -> 戻り値の型 {
関数呼び出し時に実行される文
必要に応じてreturn文で戻り値を返却
}
EX
func double(x: Int) -> Int {
return x * 2
}
double(x: 2) // 4
実行方法
関数名(引数名1: 型, 引数名1: 型)
- 引数名がない場合は引数だけを記述。
- 戻り値が定義されている関数を呼び出す場合、戻り値を変数や定数に代入する。
- 戻り値の代入を省略するとコンパイラが警告をだす。
let 定数名 = 関数名(引数名1: 型, 引数名1: 型)
引数
関数への入力
仮引数と実引数
仮引数
関数の定義時に宣言するもの
実引数
関数の呼び出し時に指定するもの
この場合intが仮引数、1が実引数になる。
func printInt(int: Int) {
print(int)
}
printInt(int: 1)
外部引数名と内部引数名
引数名は関数の呼び出し時に使用する外部引数名と、関数内で使用される内部引数名の二つを持つことができる。
定義方法
外部引数名 内部引数名 : 型
- 外部引数名は_で省略することができる。
- 外部引数名が_で省略されている場合は、引数名と引数で分けている:も省略して呼び出す
func sum(_ int1: Int, _ int2: Int) -> Int {
return int1 + int2
}
let result = sum(1, 2)
デフォルト引数
引数のデフォルト値
- 引数にはデフォルト値を指定でき、デフォルト値を持っている引数は関数呼び出し時に省略できる。
- 引数のデフォルト値をデフォルト引数と呼ぶ。
- デフォルト引数を指定するには、通常の引数宣言のあとに値の代入を追加する
func eat(food: String = "カレー") {
print("私は\(food)が食べたい")
}
eat()
eat(food: "ラーメン")
インアウト引数
関数外に変更を共有する引数
引数の型の先頭にinout
を追加する。
インアウト引数を持つ関数を呼び出すには、インアウト引数の先頭に&
を加える。
func start(user: inout String) {
if user.isEmpty {
user = "World"
}
print("Hello, \(user)!")
}
var user: String = ""
start(user: &user) // Hello, World!
可変長引数
任意の個数の値を受け取る引数
- 関数の呼び出し側に配列であることを意識させない
- 1つの関数につき最大1つの可変長引数を定義できる
- 引数定義の末尾に...を加えて定義する
- 引数を,区切りで渡す
- 可変長引数として受け取った引数は、関数内部ではArray型として扱われる。そのため、関数内での可変長引数へのアクセス方法は、Array型の要素へのアクセス方法と同様になる。
関数内部では、可変長引数の型は[String]として扱われている。
func print(strings: String...) {
if strings.count == 0 {
return
}
print("first: \(strings[0])")
for string in strings {
print("element: \(string)")
}
}
print(strings: "abc", "def", "ghi")
//first: abc
//element: abc
//element: def
//element: ghi
戻り値
関数の出力を表す値
関数宣言での戻り値の型の指定は必須ではなく、戻り値が不要な場合は、関数宣言での戻り値の型を省略できる。
func start(user: String) {
print("Hello, \(user)!")
}
start(user: "World") // Hello, World!
関数宣言で戻り値の型の定義を省略した場合、関数の戻り値はVoid型となる。
func start(user: String) -> Void {
print("Hello, \(user)!")
}
start(user: "World") // Hello, World!
クロージャ
スコープ内の変数や定数を保持したひとまとまりの処理
クロージャについては時間がある時やります
最近は大学が忙しくて全くプログラミングに打ち込めていなかったので、これから空いてる時間を有効活用していきたい。あとインターンで手が止まる時間を減らしたい、、。
参考文献
[改訂新版] Swift 実践入門