引数の種類
引数は、関数への入力を表します。
引数は名前と型で構成されており、関数は複数の引数を持つことができます。
仮引数と実引数
関数の引数という用語は、関数の定義時に宣言するものを指す場合と、
関数の呼び出し時に指定するものを指す場合の2通りがあります。
前者を仮引数といい、後者を実引数と言います。
関数の定義時に宣言しているstring
が仮引数で、
関数の呼び出し時に指定しているこんにちは
が実引数です。
func message(_ string: String) {
print(string)
}
message("こんにちは")
外部引数名と内部引数名
引数名は、関数呼び出し時に使用する外部引数名と、
関数内で使用される内部引数名の2つを持つことができます。
引数名をこの2つに分けるには、外部引数名 内部引数名: 型
の形式で定義します。
外部引数名がto、内部引数名がsendの場合は次のようになります。
func mail(from: String, to send: String) {
print("\(from)から\(send)へメールを送信しました。")
}
mail(from: "Okada", to: "Nanba")
実行結果
OkadaからNanbaへメールを送信しました。
第二引数の内部引数名はsendとなっているため、
mail(from:to:)
関数の中ではsendという引数名を使用できます。
外部引数名には関数を利用す側から見て分かりやすい名前を、
内部引数名にはプログラムが冗長にならない名前などを指定することが一般的だと思います。
外部引数名の省略
こちらは、ちょくちょく使っています。
外部引数名を省略したい場合には、外部引数名に_
を使用します。
外部引数名が省略されている場合は、
引数名と引数を分ける:
も省略して関数を呼び出します。
func mail(_ from: String, _ send: String) {
print("\(from)から\(send)へメールを送信しました。")
}
mail("Yamada", "Saitou")
実行結果
YamadaからSaitouへメールを送信しました。
デフォルト引数
引数にデフォルト値を指定することができ、
デフォルト値を持っている引数は関数呼び出し時に省略できます。
デフォルト引数を指定するには、
通常の引数宣言の後に=とデフォルト値を追加します。
また、デフォルト値が用意されている場合でも、
通常通りに引数を渡すことは可能です。
func hello(name: String = "名無し") {
print("\(name)さんこんにちは")
}
hello()
hello("Taguchi")
実行結果
名無しさんこんにちは
Taguchiさんこんにちは
デフォルト引数はどのような引数にも定義することができ、
複数の引数に定義することも可能です。
全ての引数の指定が必要ではない関数を定義する場合などに使えます。
インアウト引数
インアウト引数は、関数内での再代入を関数外へ反映させる機能です。
この機能は知らなかったので調べて見ましたが、なかなか面白い機能でした。
インアウト引数を使用するには、引数の型の先頭にinoutキーワードを追加します。
インアウト引数を持つ関数を呼び出すには、インアウト引数の先頭に&を付けます。
mail(address:)
関数の引数に、空文字が代入されている変数addを指定します。
if address.isEmpty
の部分で、引数が空文字だった場合は、
test@gmail.com
を代入しています。
関数内のprint( )は、もちろん代入されたアドレスを表示します。
そして、関数外の変数addをprint( )で表示すると空文字ではなく値が存在します。
func mail(address: inout String) {
if address.isEmpty {
address = "test@gmail.com"
}
print(address)
}
var add = ""
mail(address: &add)
print(add)
実行結果
test@gmail.com
test@gmail.com
可変長引数
可変長引数とは、任意の個数の値を受け取ることができる引数のことです。
配列を引数に取ることでも複数の値を受け取ることは可能ですが、
可変長引数には関数の呼び出し側に配列であることを意識させないというメリットがあります。
Swiftでは、一つの関数につき、一つの可変長引数を定義することが可能です。
可変長引数の定義方法は、引数定義の末尾に...
を付けるだけです。
可変長引数を呼び出す際には,(カンマ)
で区切って値を渡します。
可変長引数を受け取った関数側は、引数をArray<Element>型として扱います。
つまり、可変長引数へのアクセス方法は、
Array<Element>型の要素へのアクセス方法と同じです。
menus(menu:)
関数は、可変長引数になっており、
複数のString型の値を引数として受け取ることができます。
関数内部では[String]型
として扱われます。
なのでfor文などで回すことが可能です。
func menus(menu: String...) {
if menu.count == 0 {
return
}
for item in menu {
print(item)
}
}
messages(menu: "サバの味噌煮","豚骨ラーメン","ペペロンチーノ")
実行結果
サバの味噌煮
豚骨ラーメン
ペペロンチーノ
以上が関数におけるいろいろな引数の紹介になります!
【Swift】関数の使い方〜その1〜 と
【Swift】関数の使い方〜その3〜 もございますので
ぜひそちらもご覧いただければと思います。
最後までご覧いただきありがとうございました。