[初心者向け]Swiftにおけるfunctionの使い方まとめ

# 概要

Swiftにおける関数はiOS開発において大いに重要です。

今回はその主要な使用方法を今回はまとめました。
随時更新していくため、ブックマークしていただけるとお役に立てると思います。

# 環境
Xcode : 14.3 
Swift : 5.8

# 目次

- **Step 1: 関数の定義**
- **Step 2: 関数の呼び出し**
- **Step 3: 複数のパラメータを持つ関数**
- **Step 4: 関数内での変数と定数の使用**
- **Step 5: デフォルトパラメータ値**
- **Step 6: 可変長引数**
- **Step 7: 複数の返り値を持つ関数**
- **Step 8 : 返り値を持たない場合**
- **Step 9 : 引数ラベルの省略**
- **Step 10 : inoutパラメータ(パラメータを関数を用いて更新する)**
- **Step 11 : パラメータと異なる変数名を関数内で使用する（Argument Label）**

# **Step 1: 関数の定義**

関数は **func** キーワードを使って定義します。**関数名**、**パラメータ、パラメータの型、戻り値の型**が必要です。

```swift

func 関数名(name: パラメータの型) -> 戻り値の型 {
    return 返り値  //上記で定義した型
}

```

具体的な関数定義の例

```swift
func greet(name: String) -> String {
    return "Hello, \(name)!"
}
```

上記の例では、**greet** という名前の関数を定義しています。この関数は、**String**型の**name**パラメータを受け取り、**String** 型の戻り値を返します。

## **Step 2: 関数の呼び出し**

関数を呼び出すには、関数名と括弧内にパラメータを指定します。

この時にパラメータを明示する必要があることに注意してください。

```swift

let greeting = greet(name: "Alice")
print(greeting)  // "Hello, Alice!"
```

上記の例では、**greet**関数に**Alice**を引数として渡しています。関数の戻り値は、**greeting**変数に代入され、その後、**print**関数で出力されます。

この時

```jsx
greet("Alice") 
```

これはパラメータを明示してないためエラーになります。

# **Step 3: 複数のパラメータを持つ関数**

複数のパラメータを持つ関数を定義するには、**パラメータをカンマで区切ります。**

```swift
func add(a: Int, b: Int) -> Int {
    return a + b
}

let sum = add(a: 3, b: 5)
print(sum)  // 8
```

上記の例では、2つの**Int**型のパラメータ**a**と**b**を持つ**add**関数を定義しています。この関数は、**a**と**b**の和を返します。

# **Step 4: 関数内での変数と定数の使用**

関数内で **変数や定数を使用することができます。** **let** を使って定数を定義し、**var** を使って変数を定義します。

```swift

func incrementAndDouble(number: Int) -> Int {
    let increment = 1
    var result = number + increment
    result = result * 2
    return result
}

let doubled = incrementAndDouble(number: 4)
print(doubled)  // 10

```

上記の例では、**incrementAndDouble**関数内で、定数**increment**と変数**result**を定義しています。

# **Step 5: デフォルトパラメータ値**

関数のパラメータには、**デフォルト値を設定することができます。**デフォルト値を持つパラメータは、関数呼び出し時に**省略することができます。**

```swift

func createGreeting(name: String, prefix: String = "Hello") -> String {
    return "\(prefix), \(name)!"
}

let greeting1 = createGreeting(name: "Alice")
print(greeting1)  // "Hello, Alice!"

let greeting2 = createGreeting(name: "Bob", prefix: "Hi")
print(greeting2)  // "Hi, Bob!"

```

上記の例では、**createGreeting**関数の**prefix**パラメータにデフォルト値 **"Hello"** を設定しています。関数呼び出し時に**prefix**引数を省略すると、デフォルト値が使用されます。

# **Step 6: 可変長引数（個数が決まっていない場合）**

関数のパラメータに **...** を使うことで、**可変長引数を定義することができます。** 可変長引数は、関数呼び出し時に複数の引数を渡すことができます。

```swift

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

let totalSum = sum(numbers: 1, 2, 3, 4, 5)
print(totalSum)  // 15

```

上記の例では、**sum**関数に可変長引数**numbers**を定義しています。関数呼び出し時に複数の引数を渡すことができ、それらの引数は関数内で配列として扱われます。

# **Step 7: 複数の返り値を持つ関数**

関数は、タプルを使用して複数の値を返すことができます。タプルは、カンマで区切られた複数の値を括弧で囲んだものです。

```swift

func minMax(numbers: [Int]) -> (min: Int, max: Int) {
    var currentMin = numbers[0]
    var currentMax = numbers[0]

    for number in numbers {
        if number < currentMin {
            currentMin = number
        } else if number > currentMax {
            currentMax = number
        }
    }

    return (currentMin, currentMax)
}

let result = minMax(numbers: [2, 4, 1, 8, 3])
print(result.min)  // 1
print(result.max)  // 8

```

上記の例では、**minMax**関数が**Int**型のタプルを返しています。このタプルは、**min**と**max**の2つの値を持ちます。

# Step 8 : **返り値を持たない場合**

返り値を持たない関数は、 **->** と戻り値の型を省略して定義できます。このような関数は、副作用のために呼び出されます。

```swift
func printGreeting(name: String) {
    print("Hello, \(name)!")
}

printGreeting(name: "Alice")

// Allow があっても良い
func printGreeting(name: String) ->(){
    print("Hello, \(name)!")
}
```

上記の例では、**printGreeting**関数は返り値を持たず、**print**関数を使って挨拶を表示します。

# Step 9 : **引数ラベルの省略**

関数の呼び出し時に**引数ラベルを省略**するには、 **_** を使用します。これにより、実行時よりにより簡略化した実行が可能にあります。

```swift
func multiply(_ a: Int, _ b: Int) -> Int {
    return a * b
}

let product = multiply(3, 4)
print(product)  // 12

```

上記の例では、**multiply**関数の両方の引数ラベルを省略しています。関数呼び出し時に引数ラベルを指定せずに引数を渡します。

# Step 10 : **inout(関数内の変更を関数外にも反映させる)**

**inout**キーワードを使用して、関数内で変更された引数の値が呼び出し元に反映されるようにできます。このような引数は、関数呼び出し時に **&** を使用して渡す必要があります。

```swift
func swapValues(_ a: inout Int, _ b: inout Int) {
    let temp = a
    a = b
    b = temp
}

var value1 = 1
var value2 = 2

swapValues(&value1, &value2)
print(value1)  // 2
print(value2) // 1

```

上記の例では、**swapValues**関数は**inout**パラメータ**a**と**b**を使用しています。関数内で**a**と**b**の値が入れ替えられ、呼び出し元の**value1**と**value2**にも変更が反映されています。

# Step 11 : **パラメータと異なる変数名を関数内で使用する（Argument Label）**

引数ラベルは、**関数の呼び出し時に引数の役割を明確にするため**に使用されます。引数ラベルを使うことで、関数の呼び出し側のコードが自然な言語に近い形で読めるようになり、コードの可読性が向上します。

引数ラベルは、関数の定義時に**引数ラベルの前に配置**し、スペースで区切ります。以下に例を示します。

```swift

func joinStrings(prefix: String, with separator: String, and suffix: String) -> String {
    return prefix + separator + suffix
}

let result = joinStrings(prefix: "Hello", with: ", ", and: "World!")
print(result)  // "Hello, World!"

```

上記の例では、**joinStrings**関数に3つの引数があり、それぞれに引数ラベルが指定されています。関数呼び出し時に、引数ラベルを使用して引数がどのパラメータに対応するかを明確にします。この場合、**prefix**引数には **"Hello"** が、**separator**引数には **","** が、**suffix**引数には **"World!"** が渡されます。

---

# まとめ

今回は、Swiftにおける。functionの使い方をまとめました。

何かご指摘やアドバイス等あればお待ちしております。

いいね、ブックマーク、フォローしていただけると勉強の励みになりますので是非お願いします。😉

-- 追伸　-- 
Twitterで日々の学習風景を投稿してます。
https://twitter.com/Ren_yello

---
## 参考にさせていただいたサイト様達

[https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions/](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions/)

[https://kimuralog.com/?p=1310](https://kimuralog.com/?p=1310)

[https://qiita.com/rei_012/items/57111fdb98ee6ef8c2fc](https://qiita.com/rei_012/items/57111fdb98ee6ef8c2fc)

[https://ponsuke-tarou.hatenablog.com/entry/2018/03/23/171557](https://ponsuke-tarou.hatenablog.com/entry/2018/03/23/171557)

[https://qiita.com/kamimi01/items/64b54264011f8ba2ddc0](https://qiita.com/kamimi01/items/64b54264011f8ba2ddc0)

[可変長引数とは - IT用語辞典](https://e-words.jp/w/可変長引数.html)