[Swift] 関数定義

Swiftでも関数とオブジェクトはもちろんあります。
関数定義はfuncキーワードから始まります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 関数宣言はfuncから始まる。戻り値は -> の後に記載
func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}
 
// call する時にはラベルの記載は必須
// 関数宣言の際に、_を書いておくと呼び出す時にラベルを省略できる
// (外部引数名を省略する場合は"_"を書く)
print(greet(person:"Alice", day:"Monday"))
 
// 関数はタプルを返すことも可能
func calclateStatistics(scores: [Int]) -> (min:Int, max:Int, sum: Int) {
    var min = scores[0]
    var max = scores[0]
    var sum = 0
 
    for score in scores {
        if min > score {
            min = score
        } else if max < score {
            max = score
        }
        sum += score
    }
 
    return (min, max, sum)
}
 
let statistics = calclateStatistics(scores: [5, 7, 13, 2, 17])
print(statistics.max)
print(statistics.2)

関数を定義して、callする時にはラベルも記述する必要があります。
明らかにラベルが不要な場合は定義する時に_キーワードを使うと使うときに省略する事ができます。
タプルを返す事もできるので、複数の値を返したいときに使えます。

関数を返す関数

また、関数を返す関数を定義する事もできます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 関数はfirst-classタイプなので、関数が関数を返すことも可能
func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
print(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]
print(hasAnyMatches(list:numbers, condition: lessThanTen))
// true

関数はclosureの特別ケースらしいので、リストに対して処理するmap関数などに渡せます。
この辺りはpythonとかrubyとかと似ています。

1
2
3
4
5
6
7
8
9
10
// 関数はclosureの特別ケースでもある
let tmpNumbers = numbers.map({ (number: Int) -> Int in
    let result = 3 * number
    return result
})
print(tmpNumbers)
 
// Closureのタイプなどが決まっている場合は簡潔に書くことも可能
let mappedNumbers = numbers.map({number in 3 * number})
print(mappedNumbers)

map関数などが使えるのは嬉しいです。

0 件のコメント :

コメントを投稿