
Swiftを始めよう! - 関数
ある作業をまとめておいて繰り返し使えるように名前をつけて定義することができます。使うときはその定義した名前を必要なところに配置するだけ。
このような仕組みが関数と呼ばれるものになります。
関数は"func"という接頭語をつけて以下のように宣言します。
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
func 関数名(引数)-> 戻り値の型{
処理
return 戻り値
}
だいぶわかりにくいですがこれが基本型です。
使うときは
greet(person: "Bob", day: "Tuesday")
とします。
(person: "Bob", day: "Tuesday")
引数と呼ばれるもので処理に使う変数を宣言しています。この場合は
personには"Bob"を代入、dayには"Tuesday"を代入して処理しなさいという意味になります。
実行すると何も起こりません。出力するにはprint()関数を使います。
print(greet(person: "Bob", day: "Tuesday"))
を実行すると
Hello Bob, today is Tuesday).
と出力されます。戻り値のある関数は変数などに代入して使うようなデータとなっています。戻り値というのは変数として使えるデータです。
もっと使いやすくしてみましょう。
func greet(_ person: String, on day: String) -> String {
return "Hello \(person), today is \(day)."
}
引数の前にラベルをつけることができ、"_"をつけることができます。
(_ person: String, on day: String)
この場合の関数の使い方は、"_"は省略できるので
greet("John", on: "Wednesday")
となります。"_"をつけることで仮変数をつけず"John"のみで使うことができます。("on"はつける必要があります)
ラベルをつけない場合は使うときは
greet(person: "Bob", day: "Tuesday")
と仮変数を一緒に書く必要があります。
複数の戻り値を持つ関数
複数の戻り値を持つ関数です。
引数には
(scores: [Int]) ・・・ 配列は入れます
戻り値の型は
-> (min: Int, max: Int, sum: Int) ・・・ 3 つの戻り値の型を指定
戻り値は
return (min, max, sum) ・・・ 3 つの戻り値(min, max, sum)
コード
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
var min = scores[0]
var max = scores[0]
var sum = 0
for score in scores {
if score > max {
max = score
} else if score < min {
min = score
}
sum += score
}
return (min, max, sum)
}
実行は
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)
2つの"120"が出力されます。
変数 statisticsに代入して値を取り出しています。戻り値は
(min, max, sum)
となるので、その値を
statistics.sum ・・・ 変数名で取得
statistics.2 ・・・ 順番で指定(0:min,1:max,2:sum)
関数のネスト
関数の中に関数を入れることができます(nested.)。
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
実行します。
var increment = makeIncrementer()
print(increment(7))
"8"が出力されます。
関数の引数に関数
引数に関数を使うことができます。
hasAnyMatches関数の引数に調べる配列listと実際に実行に使うlessThanTe関数とを入れます。lessThanTe関数は別で定義しておきます。
引数は
list: [Int], condition: (Int) -> Bool)
で戻り値が
-> Bool
となります。戻り値が2つ並ぶのでわかりにくい感じですが、引数はカッコで囲われているので一つのものとして考えれば良いです。
以下全体です。
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
実行します。
var numbers = [20, 19, 7, 12]
print(hasAnyMatches(list: numbers, condition: lessThanTen))
"true"が出力されます。