Swiftでも関数とオブジェクトはもちろんあります。
関数定義はfuncキーワードから始まります。
```swift
`gutter:true;
// 関数宣言は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する時にはラベルも記述する必要があります。
明らかにラベルが不要な場合は定義する時に_キーワードを使うと使うときに省略する事ができます。
タプルを返す事もできるので、複数の値を返したいときに使えます。
### 関数を返す関数
また、関数を返す関数を定義する事もできます。
```swift
`gutter:true;
// 関数は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とかと似ています。
```swift
`gutter:true;
// 関数は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 件のコメント :
コメントを投稿