Swift教室 Swift と競技プログラミングの教室

関数

読了目安 約2分

func で処理に名前を付ける。引数と戻り値、Swift の特徴である引数ラベル。

この章の目次

printmin のように、呼ぶと決まった処理をしてくれる部品を関数と呼びます。 関数は自分でも定義できます。

関数を定義する

関数は func で定義します。 関数に渡す値を引数と呼び、名前と型を括弧の中に書きます。

Swift
func greet(name: String) {
    print("こんにちは、\(name)さん")
}

greet(name: "Swift")
greet(name: "太郎")

定義しただけでは動きません。 greet(name: "Swift") と呼び出した時点で、中の処理が実行されます。

戻り値

関数は計算結果を呼び出し元へ返せます。 返す値を戻り値と呼び、型を -> の後ろに書いて、return で返します。

Swift
func square(x: Int) -> Int {
    return x * x
}

print(square(x: 5))
print(square(x: 12))

return した時点で関数は終了します。 greet のように戻り値のない関数では、-> ごと省略します。 複数の値をまとめて返す方法はタプルの章で扱います。

引数ラベル

呼び出し側に書く name:x:引数ラベルと呼びます。 呼び出し時に引数の名前を書かせるのは Swift の特徴で、呼び出しを読むだけで各引数の役割が分かります。

ラベルが冗長なときは、定義側で引数名の前に _ を置くと省略できます。

Swift
func add(_ a: Int, _ b: Int) -> Int {
    return a + b
}

print(add(3, 5))

試してみよう: 定義から _ を消して実行し、呼び出し側がどんなコンパイルエラーになるか見てください。

関数に切り出す意義

関数の価値は、処理のかたまりに名前が付くことです。 使う側は square(x: 5) が 5 の 2 乗だと分かればよく、中身を読み返さずに済みます。

同じ処理を 2 回書きそうになったら、関数にまとめる合図です。 直すときも 1 か所で済みます。

学びどころ

概念一言まとめ
func処理に名前を付けて定義する
引数関数に渡す値。名前と型を括弧に書く
戻り値-> の後ろに型、return で返す
引数ラベル呼び出し時に書く引数の名前。_ で省略できる

演習

三人兄弟の年齢 A、B、C が 1 行に空白区切りで入力されます。 プレゼント代は 1 人につき、9 歳以下なら 1000 円、10 歳以上なら 年齢 × 100 円です。 三人分の合計を出力してください。

スターターコードの関数 presentPrice を完成させて解いてください。 年齢は 0 以上 100 以下の整数です。

テキスト
入力例:
5 10 15

出力例:
3500

5 歳と 10 歳は 1000 円、15 歳は 1500 円で、合計 3500 円です。

模範解答
Swift
func presentPrice(age: Int) -> Int {
    if age <= 9 {
        return 1000
    }
    return age * 100
}

let ages = readLine()!.split(separator: " ").map { Int($0)! }
let total = presentPrice(age: ages[0]) + presentPrice(age: ages[1]) + presentPrice(age: ages[2])
print(total)

return で関数が終わるので、ifelse を付けなくても正しく動きます。