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 件のコメント :
コメントを投稿