Swiftのループチットシート

# Swift Loops Cheat Sheet ([English](https://qiita.com/loic-meister-guild/items/fb8b2a968fcb5e839837))
Swift　5.0+で利用可能なループのチートシートです。
## For
Swift 3.0以降、Cスタイルの「for」ループは非推奨になりました。しかし、古いコードベースを移行している人々のためにそれも含めます。
### For-Inで[`Range`](https://developer.apple.com/documentation/swift/range)のループ
##### _n_回ループ
**非推奨**Cスタイルバージョン：

```Swift:Swift_<3.0
for var i = 0; i < 10; i++ {
    print(i)
}
```
[`...` (閉区間) 演算子](https://developer.apple.com/documentation/swift/comparable/2949800)で閉区間の`for-in`ループ：

```Swift:Swift_>=_3.0
for i in 0...10 {
    print(i)
}
```
[`..<` (半開区間) 演算子](https://developer.apple.com/documentation/swift/comparable/2949700)で半開区間の`for-in`ループ：

```Swift:Swift_>=_3.0
for i in 0..<10 {
    print(i)
}
```
##### 逆の順序で_n_回ループ
**非推奨**Cスタイルバージョン：

```Swift:Swift_<3.0
for var i = 10; i > 0; i-- {
    print(i)
}
```
[`reversed()`](https://developer.apple.com/documentation/swift/range/2996665-reversed)を使用して逆転された区間の閉区間の`for-in`ループ：：

```Swift:Swift_>=_3.0
for i in (1...10).reversed() {
    print(i)
}
```
##### ストライドでループ
**非推奨**Cスタイルバージョン：

```Swift:Swift_<3.0
for var i = 0; i < 10; i += 2 {
    print(i)
}
```
[`stride(from:to:by:)`](https://developer.apple.com/documentation/swift/1641347-stride)を使用して指定された量でステップする半開区間の`for-in`ループ：


```Swift:Swift_>=_3.0
for i in 0.stride(to: 10, by: 2) {
    print(i)
}
```
### [Array](https://developer.apple.com/documentation/swift/array)のループ
##### [`Array`](https://developer.apple.com/documentation/swift/array)の配列値のループ
**非推奨**Cスタイルバージョン：

```Swift:Swift_<3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for var i = 0; i < someNumbers.count; i++ {
    print(someNumbers[i])
}
```
[`Array`](https://developer.apple.com/documentation/swift/array)のすべての値の`for-in`ループ：

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for number in someNumbers {
    print(number)
}
```
[`Array`](https://developer.apple.com/documentation/swift/array)のすべての値の[`forEach`](https://developer.apple.com/documentation/swift/array/1689783-foreach)ループ：

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
someNumbers.forEach { number in
    print(number)
}
```
##### 逆の順序で[`Array`](https://developer.apple.com/documentation/swift/array)の配列値のループ
**非推奨**Cスタイルバージョン：

```Swift:Swift_<3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for var i = someNumbers.count - 1; i >= 0; i-- {
    print(someNumbers[i])
}
```
[`reversed()`](https://developer.apple.com/documentation/swift/range/2996665-reversed)を使用して逆転された[`Array`](https://developer.apple.com/documentation/swift/array)のすべての値の`for-in`ループ：

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for number in someNumbers.reversed() {
    print(number)
}
```
[`reversed()`](https://developer.apple.com/documentation/swift/range/2996665-reversed)を使用して逆転された[`Array`](https://developer.apple.com/documentation/swift/array)のすべての値の[`forEach`](https://developer.apple.com/documentation/swift/array/1689783-foreach)ループ：

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
someNumbers.reversed().forEach { number in
    print(number)
}
```
##### [`Array`](https://developer.apple.com/documentation/swift/array)のインデックス付きの配列値のループ
**非推奨**Cスタイルバージョン：

```Swift:Swift_<3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for var i = 0; i < someNumbers.count; i++ {
    print("\(i + 1): \(someNumbers[i])")
}
```
[`enumerated()`](https://developer.apple.com/documentation/swift/array/1687832-enumerated)を使用して列挙された[`Array`](https://developer.apple.com/documentation/swift/array)のすべての値の`for-in`ループ：

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for (index, number) in someNumbers.enumerated() {
    print("\(index + 1): \(number)")
}
```
[`enumerated()`](https://developer.apple.com/documentation/swift/array/1687832-enumerated)を使用して列挙された[`Array`](https://developer.apple.com/documentation/swift/array)のすべてのインデックスと値の[`forEach`](https://developer.apple.com/documentation/swift/array/1689783-foreach)ループ：

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
someNumbers.enumerated().forEach { (index, number) in
    print("\(index + 1): \(number)")
}
```
##### [`Array`](https://developer.apple.com/documentation/swift/array)の配列インデックスのループ
**非推奨**Cスタイルバージョン：

```Swift:Swift_<3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for var i = 0; i < someNumbers.count; i++ {
    print(i)
}
```
[`indices`](https://developer.apple.com/documentation/swift/collection/1641719-indices)を使用して列挙された[`Array`](https://developer.apple.com/documentation/swift/array)のすべてのインデックスの`for-in`ループ：

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
for index in someNumbers.indices {
    print(index)
}
```
### [`Dictionary`](https://developer.apple.com/documentation/swift/dictionary)のループ
[`Dictionary`](https://developer.apple.com/documentation/swift/dictionary))のすべてのインデックスと値の`for-in`ループ：

```Swift:Swift_>=_3.0
let scores = ["Bob": 42, "Alice": 99, "Jane": 13]

for (name, score) in scores
{
    print("\(name)'s score is \(score)")
}
```
## While
ループの始まりで評価された条件が** false **になるまで、コードを繰り返します。

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
var i = 0
while(i < someNumbers.count) {
    print(someNumbers[i])
    i += 1
}
```
## Repeat-While
ループの終わりで評価された条件が** false **になるまで、コードを繰り返します。

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
var i = 0
repeat {
    print(someNumbers[i])
    i += 1
} while(i < someNumbers.count)
```
## Break
ループの現在の反復を終了し、プログラムのフロー制御がループを終了します。
### ラベル無しの`break`
現在の反復を終了し、ループを終了します：

```Swift:Swift
for i in 1...4{
    if i == 3 {
      break
    }
    print("i = \(i)")
  }
}
```
アウトプット：

```
i = 1
i = 2 
```
### アウトプット：`break`
***ラベル付きbreakステートメント***でネストされたループを使用する場合、ラベル付きループの現在の反復を終了し、ラベル付きループを終了します：

```Swift:Swift
outerloop: for i in 1...3{
  innerloop: for j in 1...3 {
    if j == 2 {
      break outerloop
    }
    print("i = \(i), j = \(j)")
  }
}
```
アウトプット：

```
i = 1, j = 1
```
## Continue
ループの現在の反復をスキップし、プログラムのフロー制御は次の反復に進みます。
### ラベル無しの`continue`
ループの現在の反復をスキップして、次の反復に進みます：

```Swift:Swift
for i in 1...4{
    if i == 3 {
      continue
    }
    print("i = \(i)")
  }
}
```
アウトプット：

```
i = 1
i = 2
i = 4
```
### ラベル付きの`continue`
***ラベル付きcontinueステートメント***でネストされたループを使用する場合、ラベル付きループの現在の反復をスキップして、次のループに進みます：

```Swift:Swift
outerloop: for i in 1...3{
  innerloop: for j in 1...3 {
    if j == 2 {
      continue outerloop
    }
    print("i = \(i), j = \(j)")
  }
}
```
アウトプット：

```
i = 1, j = 1
i = 2, j = 1
i = 3, j = 1
```
## 高階関数
配列を操作する場合、たとえば、各配列要素に関数を適用する場合、または配列を1つの結果に減らす場合は、高階関数を使用する必要があります。
### [`Array.filter(_:)`](https://developer.apple.com/documentation/swift/array/3392999-filter)
配列内のすべてのアイテムを反復処理し、条件によってフィルタリングされたすべての要素を含む配列を返します。

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
let numbersUnder10 = someNumbers.filter { $0 < 10 }
print(numbersUnder10)
```
### [`Array.map(_:)`](https://developer.apple.com/documentation/swift/array/3017522-map)
配列内のすべてのアイテムを反復処理して変換し、変換された要素を含む配列を返します。

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
let doubledNumbers = someNumbers.map { $0 * 2}
print(doubledNumbers)
```
### [`Array.reduce(_:_:)`](https://developer.apple.com/documentation/swift/array/2298686-reduce)
配列内のすべてのアイテムを反復処理し、1つの値になるまでそれらを組み合わせます。

```Swift:Swift_>=_3.0
let someNumbers = [2, 3, 45, 6, 8, 83, 100]
let sum = someNumbers.reduce(0) { $0 + $1}
print(sum)
```
## 参照
##### 英語
- [For Loops in Swift (How To)](https://learnappmaking.com/loops-swift-how-to/)
- [Swift Alternatives to C-style for-loops](https://www.natashatherobot.com/swift-alternatives-to-c-style-for-loops/)
- [Control Flow](https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html)

###### 日本語
- [Swiftでの制御構造 (for, while, if, switch)](https://qiita.com/HaNoHito/items/8065f1c8397814dfcd9d)