【超初心者向け】関数とは 

#  最初に
この記事はswiftを勉強し始めた超初心者による超初心者のためのものになっているので、細かいミスなどが散見されるかもしれませんがご了承ください。


# 関数とは（読みにくいんで飛ばして）
そもそも関数って何だっけってなる人もいると思うのでそこから説明します。自分としては、関数はどんな処理を行うかってことが詰まってるコードの塊だと思ってます。

```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
    }
```

上のコードはTableView上のセルの内容を決める`cellForRowAt`っていう、よく見る関数です。この関数は、関数内に記述したコードに従って処理がなされていき、最終的にセルの内容が決まるっていう形で読み込まれます。
こんな感じで、関数を読み込むとその関数内のコードが読み込まれ、それに従って処理がなされます。なので、関数の使い方とか、コードの書き方とかを理解すれば自分の思った通りの処理が書けるようになります。

## 関数の構造
```swift
func 関数名(引数名:引数の型) -> 戻り値の型{
}
```
関数は基本的にこのような構造になっています。ただ、引数や戻り値は無くても使用することができるので、以下のような形の関数が良く使われるかなと思います。
```swift
func 関数名(){
}
```

## 引数・戻り値

### 引数（ひきすう）
引数とは、関数内で使用する変数のことを指します。関数名の横の丸括弧内に、`引数名: 引数の型`　という形で示されます。文で書いてもわかりにくいと思うのでコードで示してみます。
```swift
var x: Int = 1

func plus(){
   let sum = x + 1
}
```
このコードでは引数は使用されていません。関数の外で宣言された`変数x`と`変数y`が使用されています。


```swift
var x: Int = 1

func plus(number: Int){
   let sum = number + 1
}
```

では、このような関数があった時、`x`という変数を利用して`plus関数`を使用したいときはどのように記述するといいでしょうか。
```
plus(number: x)
```
このように記述すると、丸括弧内の`変数x`が`plus関数`の引数である`number`として利用されるようになります。

### 戻り値
戻り値（返り値とも）は、関数内における処理が最終的に出力する値の事です。引数を示す丸括弧の右側に　`-> 戻り値の型`　という形で示され、関数内では　`return 戻り値`　として示されます。上記のコードをもとに見ていきましょう。

```swift
var x: Int = 1

func plus(number: Int) -> Int{
   let sum = number + 1
   return sum
}

override func viewDidLoad() {
   super.viewDidLoad()

   plus(number: x)
}
```

このようなコードの場合、戻り値として返されるのは関数内の`sum`であり、その値は`2`となります。

```swift
var y: Int = 2

func plus(number: Int) -> Int{
   let sum = number + 1
   return sum
}

override func viewDidLoad() {
   super.viewDidLoad()

   plus(number: y)
}
```
この場合は、戻り値は`3`になります。
戻り値の扱いについては、次の呼び出し方についてを参照してください。


## 呼び出し方

関数の呼び出し方は3つあります（多分）。

##### ①@IBAction とか　@objc とかで呼び出す
```swift
@IBAction func next(){
   self.performSegue(identifier: "toNext", sender: nil)
}

@objc func back(){
   self.dismiss(animated: true, completion: nil)
}
```

`button`や`GestureRecognizer`などと関連付けなどして結びつけて呼び出す方法です。


##### ②処理の中で呼び出す（戻り値無し）
```swift
override func viewDidLoad() {
   super.viewDidLoad()

   loadTimeLine()
}

func loadTimeLine(){
   let query = NCMBQuery(className: "Post")
   query?.findObjectsInBackground({ (result, error)  in
      if error != nil{
         print("error")
      }else{
         print(result)
      }
   })
}
```
関数の中で関数を呼び出す方法です。呼び出したいタイミングで　`関数名（引数名: 引数に使用する変数名）` で記述すると、そのコードが読み込まれたタイミングでその関数が読み込まれます。上記のコードの場合は、`ViewDidLoad` が読み込まれたタイミングで `loadTimeLine関数` が読み込まれます。

##### ③処理として呼び出す場合（戻り値あり）
```swift
@IBOutlet var numberLabel: UILabel!

let x: Int = 1
let y: Int = 2

override func viewDidLoad() {
   super.viewDidLoad()

   let sumX = plus(number: x)
   let sumY = plus(number: y)
   let sumXY = makeSum(numX: sumX, numY: sumY)
   numberLabel.text = String(sumXY)   
}

func plus(number: Int) -> Int{
   let sum = number + 1
   return sum
}

func makeSum(numX: Int, numY: Int) -> Int{
   let sum = numX + numY
   return sum
}
```

上記のコードの場合、どのような順番でコードが読み込まれていくでしょうか。
まず、`ViewDidLoad` の中で `let sumX = plus(X)` というコードから、`plus関数` が引数を `x` として読み込まれます。`plus関数` の中では、引数である`number` は　`x` の値である１になり、その結果戻り値として `sum` つまり２が返ります。この戻り値はどこに行くかというと、この関数が読み込まれたきっかけである `let sumX = plus(X)` の `sumX` に代入されます。
次に、それと同様に `y` を引数として `plus関数` が読み込まれ、戻り値として ` sumY` に３が代入されます。
次に、`makeSum関数` が `sumX` と `sumY` を引数として読み込まれ、戻り値として５が `sumXY` に代入されます。最後に、`numberLabel` の文字に `sumXY` つまり５が表示されます。

## sender
最後に、`sender` について軽く説明します。
senderとは、その関数が呼び出された原因となるもののことをさします。（正確には違う気がするけど）

```swift
func 関数名(_ sender: sendarの型名){
}
```
という書き方をします。

```swift
@IBAction func changeColor(_sender: UIButton){
   sender.backgroundColor = .red
}
```

上記の場合、`changeColor関数` を何らかのbuttonと関連付けしていた場合、senderはそのbuttonになります。なので、`changeColor関数` を呼び出す際に押したbuttonの背景色が赤になります。

sendarのよくある使い方としては以下のようなものがあります。
```swift 
@IBOtulet var firstButton: UIButton!
@IBOutlet var secondButton: UIButton!
@IBOutlet var thirdButton: UIButton!


override func viewDidLoad() {
   super.viewDidLoad()

   firstButton.addTarget(target: self, ation: #selector(printTag(_:)), for: .touchUpInside)
   firstButton.tag = 1
   secondButton.addTarget(target: self, ation: #selector(printTag(_:)), for: .touchUpInside)
   secondButton.tag = 2
   thirdButton.addTarget(target: self, ation: #selector(printTag(_:)), for: .touchUpInside)
   thirdButton.tag = 3
}

@objc func printTag(_ sender: UIButton){
   let number = sender.tag
   print(number)
}
```

複数のbuttonに同じ関数を結びつけたとき、押されたbuttonのtagによってどのbuttonが押されたのかということを判別することができます。これは、TableViewの中のどのcellのbuttonが押されたのかっていうことを判別するのにも使用することができます。


## 最後に
いろいろ細かいミスとかあると思うので、気づいたことあったらご指摘お願いします。