関数を宣言するには func を使います。関数の名前に続けて、引数のリストを丸括弧で囲って関数を呼び出します。パラメータ名と、関数の戻り値の型を、-> で区切ります。

func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", day: "Tuesday")
EXPERIMENT
パラメータの day を削除し、挨拶文に本日のランチスペシャルを含めるパラメータを追加してみよう。

関数から複数の値をまとめて返す場合にタプルを使います。タプルの要素には名前または数値で参照できます。

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([5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)

関数は、可変数の引数を取って、配列として扱うことができます。

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(42, 597, 12)
EXPERIMENT
引数で渡される値の平均値を計算する関数を書いてみよう。

関数は入れ子(ネスト)にすることができます。ネストされた関数は外側の関数で宣言されている変数にアクセスすることができます。長くて複雑な関数のコードを整理するために関数をネストします。

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()

関数は第一級の型で、関数は別の関数を返り値にすることができます。

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

関数は別の関数を引数に取ることもできます。

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]
hasAnyMatches(numbers, condition: lessThanTen)

関数とは、実はクロージャの特別なケースで、コードブロックを後から呼び出すことができるものです。 クロージャのコードは、クロージャが生成されたスコープにある変数や関数にアクセスすることができます。これは、別のスコープで実行された場合においてさえ同様です。クロージャは波括弧 ({}) でコードを囲むことで、名前を付けずに書くことができます。引数と戻り値の型を、本体のコードから分けるために in を使います。

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
})
EXPERIMENT
奇数の場合にはゼロを返すクロージャに書き換えてみよう。

簡潔にクロージャを記述するための方法がいくつかあります。デリゲートのコールバックのようにクロージャの型がすでにわかっているときには、パラメータの型および戻り値の型を省略できます。シングルステートメントのクロージャでは、そのステートメントの値が返されることになります。

let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)

名前だけでなく、番号でもパラメータを参照することができ、特に短いクロージャで効果的です。最後の引数として関数に渡されたクロージャは、丸括弧のすぐ後に置くことができます。クロージャが関数で唯一の引数である場合には、丸括弧も省略することができます。

let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.