[SwiftUI]for, ForEach, while, forEach の違いと使用例

# for, ForEach, while, forEachの区別がつかない！！！

**for**, **while** だけならわかるが**ForEach**や**forEach**との違いがわからない。ということで自分用メモとしてもまとめました。

# 目次

- [for, ForEach, while, forEachの区別がつかない！！！](#for-forEach-while-foreachの区別がつかない)
  - [Viewを作成するときに使用できない](#viewを作成するときに使用できない)
  - [Viewを作成するときに使用できる](#viewを作成するときに使用できる)
- [使用例](#使用例)
  - [for-inループ](#for-inループ)
    - [1. 配列の要素を反復処理する](#1-配列の要素を反復処理する)
    - [2. 辞書のキーと値を反復処理する](#2-辞書のキーと値を反復処理する)
    - [3. 範囲を反復処理する](#3-範囲を反復処理する)
      - [a. 範囲区間](#a-範囲区間)
      - [b. 半開放範囲](#b-半開放範囲)
    - [4. 配列のインデックスと要素を同時に反復処理する](#4-配列のインデックスと要素を同時に反復処理する)
    - [5. stride() 関数を使った間隔を指定して反復処理する](#5-stride-関数を使った間隔を指定して反復処理する)
    - [6. 二次元配列の反復処理](#6-二次元配列の反復処理)
    - [7. 文字列を一文字ずつ反復処理](#7-文字列を一文字ずつ反復処理)
  - [Whileループ](#whileループ)
    - [1. While](#1-while)
    - [2. Repeat-while](#2-repeat-while)
  - [for-Each](#for-each)
    - [1. 配列に対して使用した例](#1-配列に対して使用した例)
    - [2. 辞書に対して使用した例](#2-辞書に対して使用した例)
    - [3. セットに対して使用した例](#3-セットに対して使用した例)
  - [ForEach](#foreach)
    - [1. 配列の各要素に対してテキストビューを作成する例](#1-配列の各要素に対してテキストビューを作成する例)
    - [2. リストビュー内でForEachを使用する例](#2-リストビュー内でforeachを使用する例)
    - [3. ForEachでデータとともに配列のインデックスも取得する例](#3-foreachでデータとともに配列のインデックスも取得する例)
- [forとfor-Eachの違いは？](#forとfor-eachの違いは)
- [まとめ](#まとめ)
- [参考にさせていただいたサイト](#参考にさせていただいたサイト)




結論としましては、**View**で使用できるか、どうかで大きく区別されます。

## Viewを作成するときに使用できない

**for**, **while**, **forEach** は **View**を作成するときには使用できません。

それらの主な差は以下になります。

**for** : コレクションや範囲に対して反復操作を行うことができます。

**while** : 指定した条件が真(true)である限り、処理を繰り返します。

**forEach** : Swiftの配列(Array)やコレクションに含まれる標準メソッドです。配列の各要素に対して処理を行います。



## Viewを作成するときに使用できる

**ForEach**:

1. SwiftUIにおけるコレクションビューの作成に利用されます。配列の各要素に対して一連のビューを生成します。
2. **ForEach**は **id**を使用して配列の各アイテムを一意に識別します。これにより、データが変更されても、SwiftUIがどのビューを更新するべきかを正確に判断することが可能となります。

# 使用例

次に、それらの使い方を見ていきます。

PythonやCとは機能的には一緒でも、表記の仕方がかなり異なるイメージです。


## for-inループ

### 1. 配列の要素を反復処理する:

```swift
let names = ["Alice", "Bob", "Charlie", "David"]

for name in names {
    print("Hello, \(name)!")
}
```

### 2. 辞書のキーと値を反復処理する:

```swift
let fruitColors = ["Apple": "Red", "Banana": "Yellow", "Grape": "Purple"]

for (fruit, color) in fruitColors {
    print("\(fruit) is \(color)") 
}
```

### 3. 範囲を反復処理する:

#### a. 範囲区間

x…y だと x≤ a ≤ y 

```swift
for number in 1...5 {
    print("Number is \(number)")
}

// Number is 1
// Number is 2
// Number is 3
// Number is 4
// Number is 5
```

#### b. 半開放範囲

x..<y だと x≤ a < y 

```swift
for number in 1..<5 {
    print("Number is \(number)")
}

// Number is 1
// Number is 2
// Number is 3
// Number is 4
```

### 4. 配列のインデックスと要素を同時に反復処理する:

**enumerated()**で**index**と要素を両方取れる

**indices**は**index**だけを取得するため、要素は取れない

**indices.enumerated()** にするとindexと要素両方取れる

```swift
let animals = ["Dog", "Cat", "Elephant", "Giraffe"]

for (index, animal) in animals.enumerated() {
    print("Index: \(index), Animal: \(animal)")
}

for index in animals.indices {
    print("Index: \(index), Animal: \(animal[index])")
}

for (index, animal) in animals.indices.enumerated() {
    print("Index: \(index), Animal: \(animal)")
}
```

### 5. **stride()** 関数を使った間隔を指定して反復処理する:

0≤ a < 10　で10が含まれないことに注意

```swift
for number in stride(from: 0, to: 10, by: 2) {
    print(number)
}

// 0
// 2
// 4
// 6
// 8.
```

### 6. 二次元配列の反復処理

```swift
let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for row in matrix {
    for element in row {
        print(element)
    }
}
```

### 7. 文字列を一文字ずつ反復処理

```swift
let greeting = "Hello, World!"

for character in greeting {
    print(character)
}
```

## whileループ

### 1. while

**while** の対象となる値がtrueの間処理を続ける

(注) **for** と違いコードによっては無限ループになる可能性がある

```swift
var count = 1

while count <= 5 { //5を超えるまでル＝プが回る
    print("Count is \(count)")
    count += 1  
}
```

### 2. Repeat-while

**while**では条件によっては一度も処理が実行されることがないときがあったが、**Repeat-while**では、少なくとも一回はループ内の処理を行う。

```swift
var number = 0

repeat {
    number += 1
    print("Number is \(number)")
} while number < 5
```

## for-Each

基本の構文

```swift
array.forEach { value in
		//arrayの要素がvalueに割り当てられ、valueとして扱える。
}
```

### 1. 配列に対して使用した例

```swift
let numbers = [1, 2, 3, 4, 5]

numbers.forEach { number in
    print("Number is \(number)")
}

```

### 2. 辞書に対して使用した例

```swift
let fruitColors = ["Apple": "Red", "Banana": "Yellow", "Grape": "Purple"]

fruitColors.forEach { (fruit, color) in
    print("\(fruit) is \(color)")
}
```

### 3. セットに対して使用した例

```swift
let uniqueNumbers: Set = [1, 2, 3, 4, 5]

uniqueNumbers.forEach { number in
    print("Number is \(number)")
}
```

## ForEach

### 1. 配列の各要素に対してテキストビューを作成する例:

```swift
struct ContentView: View {
    let names = ["Alice", "Bob", "Charlie", "Dave"]

    var body: some View {
        VStack {
            ForEach(names, id: \.self) { name in
                Text(name)
            }
        }
    }
}
```

このコードでは、**names**という配列の各要素に対して、その要素の値を表示する**Text**ビューが作成されます。結果として、"Alice", "Bob", "Charlie", "Dave"というテキストが垂直に並べられたビューが生成されます。

### 2. リストビュー内でForEachを使用する例:

```swift
struct ContentView: View {
    let todos = ["Buy groceries", "Finish homework", "Clean the house"]

    var body: some View {
        List {
            ForEach(todos, id: \.self) { todo in
                Text(todo)
            }
        }
    }
}
```

この例では、**todos**という配列の各要素に対してリストの行が生成されます。**ForEach**はリストビュー、ナビゲーションビュー、またはその他のシーケンスビュー内でよく使用されます。

### 3.  ForEachでデータとともに配列のインデックスも取得する例:

```swift
struct ContentView: View {
    let names = ["Alice", "Bob", "Charlie", "Dave"]

    var body: some View {
        List(Array(names.enumerated()), id: \.element) { (index, name) in
            Text("\(index + 1). \(name)")
        }
    }
}


//indicesでも同様の処理ができる
struct ContentView: View {
    let names = ["Alice", "Bob", "Charlie", "Dave"]

    var body: some View {
        List {
            ForEach(names.indices, id: \.self) { index in
                Text("\(index+1). \(names[index])")
            }
        }
    }
}

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/9bf7b201-0664-ca1a-2a98-074762c38973.png)


この例では、**names**配列の各要素とそのインデックスを取得しています。**enumerated()**関数と**Array()** イニシャライザを使用することで、インデックスと要素のペアの新しい配列を作成し、それを**ForEach**でループしています。

# forとfor-Eachの違いは？

for-Eachではbreak,continue が使えない

for-Eachは関数であり、forは演算子であるため、関数型プログラミングに使用できる

# まとめ



今回は、Swiftにおける。for, ForEach, while, forEachの使い方をまとめました。

Viewの生成に使えるかってのが、Swiftならではですね。


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

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

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



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

https://agrawalsuneet.github.io/blogs/for-in-vs-for-each-in-swift/