【プログラミング初心者】Swift基礎~for文・while文~

#はじめに
今回はプログラムの基本である繰り返しの方法について紹介します。
多少書き方の違いはありますがSwift以外の多言語全てで使用されるプログラムの基本構文の１つです。
この投稿で書き方をしっかりと覚えておいてください。

# 繰り返しとは
プログラムでは同じ処理を何度も繰り返して実行することが多くあります。
そんなときに繰り返し処理である`for`や`while`を使います。

例えば簡単な例でいくと、あるStringを格納した配列が定義されており、その内容全てを表示したいとします。
繰り返しを使わなければ以下のようになります。

```swift
var fruitsList = ["りんご", "みかん", "スイカ"]

print(fruitsList[0])  // りんご
print(fruitsList[1])  // みかん
print(fruitsList[2])  // スイカ
```
この配列の要素が100個になると100回`print()`を記述しなければなりません。

またプログラムの実行中に`stringList`に要素が追加された場合、その追加された要素に対して処理することができません。

そんなときに繰り返し制御を行って解決します。

# for文
`for`の構文は以下となります。

```swift
for 定数 in 配列 {
    繰り返す処理
}
```
`for`文は上記の書き方をすると配列の0番目から要素が取り出され、定数に格納されます。
取り出された後処理ブロック内に書かれた処理を実行します。
配列の最後まで要素を取り出し処理が完了すると繰り返しが終了します。

[最初](#繰り返しとは)の例を`for`を使って書き直してみます。

```swift
var fruitsList = ["りんご", "みかん", "スイカ"]
for fruits in fruitsList {
    print(fruits)
}
```
```:実行結果
りんご
みかん
スイカ
```
また直接配列のインデックスを指定しているわけではないので、要素が追加されても対応できます。

```swift
var fruitsList = ["りんご", "みかん", "スイカ"]
for fruits in fruitsList {
    print(fruits)
}

print("--- 要素を追加 ---")

fruitsList.append("パイナップル")
fruitsList.append("いちご")
for fruits in fruitsList {
    print(fruits)
}
```
```:実行結果
りんご
みかん
スイカ
--- 要素を追加 ---
りんご
みかん
スイカ
パイナップル
いちご
```
## 指定回数繰り返す
次の例は指定回数処理を繰り返す方法です。
※多言語のようなインデックスをインクリメントする方法はありません。

```swift
for index in 1...10 {
    print("index:\(index)") 
}
```
```:実行結果
index:1
index:2
index:3
index:4
index:5
index:6
index:7
index:8
index:9
index:10
```
実はこの処理は[先程](#for文)説明した要素を取り出す方法と同じです。
今回配列部分に`1...10`と指定しました。
これは1~10の`Int`型配列を作る書き方です。
そのため作られた10要素を持つ配列から１つずつ要素が取り出されたというわけです。
(正確には配列ではなく`Range<Int>`という型です)

## 辞書型をfor文で処理する
辞書型も配列と同様に`for`文で処理できます。

```swift
let fruitsList = ["apple": "りんご",
                  "mandarin_orange": "みかん",
                  "watermelon": "スイカ"]
for (key, value) in fruitsList {
    print("key: " + key)
    print("value: " + value)
    print("---")
}
```
```:実行結果
key: watermelon
value: スイカ
---
key: mandarin_orange
value: みかん
---
key: apple
value: りんご
---
```
辞書型の場合、`(key, value)`のように要素を取り出しています。
これは`Tuple`型といい、今回詳しくは説明しませんが複数の値を同時に扱う方法です。
メソッドのない構造体のようなイメージです。

辞書型の場合`Tuple`として取り出すことができ、第一要素にキー、第二要素に値が入ってきます。
また`(key, value)`とわかりやすいように定義していますが、この変数名は自由に決めることができ、`(a, b)`というように取り出しても問題ありません。
重要なのは第一要素にキー、第二要素に値ということだけです。

# while文
次は`while`文を紹介します。
`while`の構文は以下となります。

```swift
while 継続条件 {
    繰り返す処理
}
```
継続条件は`if`文のように`Bool`型で与える必要があります。
継続条件が`false`となったタイミングで処理を抜けます。

以下の例は整数を１ずつ足していき、合計が10になったら繰り返しを終了する処理です。

```swift
var sum = 0
while sum < 10 {
    sum += 1
    print("合計: \(sum)")
}
```
```:実行結果
合計: 1
合計: 2
合計: 3
合計: 4
合計: 5
合計: 6
合計: 7
合計: 8
合計: 9
合計: 10
```
気をつけたいことは今回の例では発生することはあり得ませんが、条件文が常に`true`になってしまうと無限ループが発生してしまいます。
無限ループが発生するとそれ以降の処理は一切実行されず、アプリはフリーズしてしまいます。

簡単に無限ループさせるには以下のようにします。
※実行すると永遠に処理が走るので実行はおすすめしません。実行したとしても適度なタイミングでプログラムを停止してください。

```swift
while true {
    sum += 1
    print("合計: \(sum)")
}
```
継続条件に固定値として`true`が入っているので処理を抜けることはありません。

これは単純な例ですが、複雑な条件や処理になると発生してしまうので注意してください。

# 処理を途中で抜ける
繰り返し処理を行っている中で途中で処理を抜けたいということがたまに発生します。

例えば検索処理などです。
配列の中から見つけたい要素があったら変数に格納し以降の処理は行わない、というように実装したいとします。
その場合`break`というものを使い処理ブロックを抜けます。
以下が具体的な実装です。

```swift
let fruitsList = ["りんご", "パイナップル", "いちご", "オレンジ", "スイカ"]
var orange = ""

for fruits in fruitsList {
    if fruits == "オレンジ" {
        orange = fruits
        break  // ここでforの処理を抜ける
    }
    print("fruits: \(fruits)")
}

print("検索結果: \(orange)")
```
```:実行結果
fruits: りんご
fruits: パイナップル
fruits: いちご
検索結果: オレンジ
```
実行結果を見ると`print("fruits: \(fruits)")`が「オレンジ」と「スイカ」では実行されていません。
`fruits`の値が「オレンジ」になったときに`if`の処理ブロックに入り、`break`で`for`の処理ブロックを抜けたためです。

`while`でも同様に`break`を実行すると処理ブロックから抜けることができます。

# forとwhileの違い
繰り返し処理という意味ではこの２つに違いはありません。
違いとしては`for`は配列など数が決まっているものに対して行う有限の繰り返しに対し、`while`は終了条件を満たすまで繰り返される処理ということです。

C言語などではよく使いますが、Swiftではあまり`while`文は見かけません。
ですがが、処理を待ち受けたいときなど使う場面もあります。
通信処理などでたまに使うイメージです。

どちらも使えるようにしておきたいところです。

#最後に
今回はSwiftで繰り返し処理を行う方法を紹介しました。
繰り返し処理は条件分岐処理と同様に重要でプログラミングの基礎となる内容なのでこの機会にしっかりと押さえておきましょう。

今回の内容は以上です。
本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載は以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/