Swift さくっと確認したい基礎文法 [いろいろな関数]



# 関数

swiftでの関数の定義、呼び出し方についてまとめます。

タプルで複数の値を戻り値にしたり、
関数を変数に入れて引数で渡したり戻り値にしたり、、、、

などなどたくさんのことができます！

あれってどう書くんだっけ？
といった時の確認用に使ってもらえると嬉しいです。

## 基本形

#### 定義
```swift

func sayHello(){
	println("hello")
}
```
#### 呼び出し方
```swift

sayHello()   // hello
```

## 引数なしの関数

```lang:swift
func dice() -> Int {
    let number = 1 + Int(arc4random_uniform(6))  // 1~6の乱数
    return number
}

sayHello()   // 4
```
## 引数ありの関数


```swift
func 関数名(引数:型) -> 戻り値の型 {
	// 処理
　　return 戻り値
}
```

```swift
func attack(power:Int) -> Int {
    let rand = Int(arc4random_uniform(20))
    return power + rand
}

let damage = attack(100)
println("\(damage)のダメージを与えた") // 112のダメージを与えた
```

## 引数ありの関数(外部引数名付き)

引数ありの関数を使う場合、
何を引数に指定しているか分からないため、
関数のソースを読む必要があるかもしれません。

それは面倒なので、
引数に名前を付けることで、何を指定しているかを明示することができます。


```swift
func 関数名(外部引数名 引数:型) -> 戻り値の型 {
	// 処理
　　return 戻り値
}
```

```swift
func attack(power pw:Int) -> Int {
    let rand = Int(arc4random_uniform(20))
    return pw + rand
}

let damage = attack(power:100) // powerを引数に設定していることが分かる。
println("\(damage)のダメージを与えた") // 112のダメージを与えた
```

引数名と外部引数名を一緒にする場合は
次のように書くことで省略できます。

```swift
func 関数名(#引数:型) -> 戻り値の型 {
	// 処理
　　return 戻り値
}
```

```swift
func attack(#power:Int) -> Int {
    let rand = Int(arc4random_uniform(20))
    return power + rand
}

let damage = attack(power:100) // powerを引数に設定していることが分かる。
println("\(damage)のダメージを与えた") // 112のダメージを与えた
```

## 引数の個数を指定しない関数

引数に設定する数を指定したくない場合は、
`引数：型...`と書いて引数を指定します。


```swift
func 関数名(引数:型...) -> 戻り値の値 {
	// 処理
　　return 戻り値
}
```

```swift
func sum(#numbers:Int...) -> Int {
    var total = 0
    for number in numbers{
        total += number
    }
    return total
}

let result = sum(numbers:1,2,3,4,5)
println(result) // 15
```


## 引数に初期値を設定する関数

引数には初期値を与えることができます。
関数を呼び出す際、引数を指定しないと初期値が利用されます。


```swift
func 関数名(引数:型 = 初期値) -> 戻り値の型 {
	// 処理
　　return 戻り値
}
```

```swift
func attack(power:Int = 100) -> Int {
    var rand = Int(arc4random_uniform(20))
    return power + rand
}

// 引数を指定しない場合、初期値が使われる。= attack(power:100)
let damage1 = attack() 
let damage2 = attack(power:250) // 外部引数名付き

println("\(damage1)のダメージを与えた") // 114のダメージを与えた
println("\(damage2)のダメージを与えた") // 250のダメージを与えた
```

初期値を設定する場合、`#`を使わなくても外部引数名付きで引数を渡します。


## 引数を変数として使う場合

関数内で引数のパラメータは、
定数として扱われるため、代入することはできません。

引数を代入可能にしたい場合は
下記のように引数の前に`var`を書いて変数として宣言します。

```swift
func 関数名(var 引数:型) -> 戻り値の型 {
	// 処理
　　return 戻り値
}
```

```swift
func attack(var #damage:Int) -> Int {
    damage += Int(arc4random_uniform(20))
    return damage
}

let damage = attack(damage: 250) 
println("\(damage)のダメージを与えた") // 266のダメージを与えた
```

## 複数の戻り値を設定する場合

一般的な言語の関数は戻り値を一つしか指定できませんが、
swiftではタプル(tuple)を使うことで
戻り値の値を複数指定することができます。

```swift
func 関数名(引数:型) -> (ラベル1:戻り値1の型,ラベル2:戻り値2の型,ラベル:戻り値3の型) {
	// 処理
　　return (戻り値1,戻り値2,戻り値3)
}
```

```swift

/* 攻撃力を指定して、攻撃力と追加ダメージと合計ダメージを返します。 */
func attack(#power:Int) -> (power:Int,extraDamage:Int,totalDamage:Int) {
    let extra = Int(arc4random_uniform(20))
    let total = power + extra
    
    return (power,extra,total)
}

// タプル(power:Int,extraDamage:Int,totalDamage:Int)
var result = attack(power:200) 

println("攻撃力：\(result.power)") // 200
println("追加ダメージ：\(result.extraDamage)") // 11
println("合計ダメージ：\(result.totalDamage)") // 211
```


## ジェネリックな関数

基本的に、関数の引数には型の指定が必須ですが、
`関数名<T>()`と指定することで型を未定な状態で関数を定義できます。

```swift
func 関数名<T>(引数名:T ...) ->[T] {
	// 処理
　　return [T]()の値
}
```

```swift

/* 指定した値で配列を作ります。*/
func createArray<T>(items:T ...) -> [T] {
    var resultArray = [T]()
    for item in items {
        resultArray += [item]
    }
    return resultArray
}

var array = createArray(1,2,3,4,5) // 型はInt[]
println(array.count) // 5 

```


下記をまとめた
[Swift さくっと確認したい基礎文法 \[関数オブジェクト\]](http://qiita.com/yuinchirn/items/79e121281918cc87be46)も御覧ください。
①関数を変数に代入する方法
②関数を引数に指定する方法
③関数を戻り値に指定する方法