Swift さくっと確認したい基礎文法 [いろんなループ処理]



# ループ処理

for文、for-in文、while文、do-while文などありますが、
Swiftではなるべくfor-in文を使うのが良さそうです。

## **for-in** ~指定範囲から順に値を取り出して実行~


```swift
for 変数 in 開始値...最終値 {
	// 処理
}

for 変数 in 開始値..<最終値 { // 最終値を含まない
	// 処理
}

```
開始値から始まり、最終値になるまで
カウントアップして処理が実行されます。

順番に『変数』に現在の値が入ります。

※注意点
変数には、『var』を宣言しません。

```swift

var sum:Int = 0
for num in 1...5 {
  sum += num
  println("\(num)回目：\(sum)")
}

```

```swift:出力
1回目：1
2回目：3
3回目：6
4回目：10
5回目：15
```

取り出した変数を使わない場合は、
以下のようにワイルドカード(_)を使うことができます。

```swift
for _ in 1...5 {
  let num = arc4random_uniform(100)
  println(num)
}
```

```swift:出力
10
86
87
93
64
```



## **for-in** ~コレクションの値を順に取り出す~

```swift
for 変数 in コレクション {
	// 処理
}
```

一番利用すると思われるのがこのfor-in文。

コレクション(配列、辞書)などを順に取り出して処理を行う。
要素の分だけループされる。


### Array型の場合

```swift

let numList = [10,43,231,43,54] 
for num in numList {
	println(num)
}
```
```lang:出力
10
43
231
43
54
```

### Dictionary型の場合

```swift
let menuList = ["coffee": 320, "tea": 280, "latte": 380, "cappuccino": 380, "mocca": 400]

for (menu,price) in menuList {
    println("\(menu)は\(price)円")
}
```

```lang:出力
cappuccinoは380円
coffeeは320円
moccaは400円
latteは380円
teaは280円
````

上ように扱うことができる。
ただ、取り出される順番はインデックス順にはならない。
※Dictionaryにはインデックスが存在しない。



また、下記のように辞書(Dictionary)のキーのみ、値のみ取り出すこともできる。

```swift
for menu in menuList.keys {
    println(menu)
}

for price in menuList.values {
    println(price)
}
```

```lang:出力
cappuccino
coffee
mocca
latte
tea

380
320
400
380
280
```

### String型の場合

```swift
for char in "Swift"{
    println(char)
}
```
```lang:出力
S
w
i
f
t
````

## **for** ~カウンタを数えて繰り返す~

```swift
// Stringの配列
let drinkList = ["coffee","tea","latte","cappuccino","mocca"]

// drinkListの要素分だけループ
for(var i=0; i<drinkList.count; i++) {
    println(drinkList[i])
}
```

```lang:出力
coffee
tea
latte
cappuccino
mocca
````

## **while** 


```swift
while (ループ条件) {
	//処理
}
```

ループ条件を満たしている限り処理をループする文。
swiftに限ったことは特にありません。

```swift
var spelUseCount = 5

while(spelUseCount > 0) {
    //処理
    println("⚪︎⚪︎はファイアの魔法を使った！")
    spelUseCount--
}
```

```lang:出力
⚪︎⚪︎はファイアの魔法を使った！
⚪︎⚪︎はファイアの魔法を使った！
⚪︎⚪︎はファイアの魔法を使った！
⚪︎⚪︎はファイアの魔法を使った！
⚪︎⚪︎はファイアの魔法を使った！
```

## **do-while**

```swift
do {
	// 処理
} while (ループ条件) 
```

while文はループ条件をチェックした後に処理を行っていた。
なので、条件を満たしていなければ一度も実行されない。

それに対して、
do-while文は一度実行された後にループ条件をチェックするため
必ず一度は実行される。

```swift
var result:UInt32

// 乱数resultが50未満であれば、ループする。
do {
    result = arc4random_uniform(100) // 0~99の乱数
} while (result < 50)
```

```lang:出力
22
63 // 50以上のためここで終了
```

# ループにラベルをつける

for文などのループに`hogehoge:for(...)`と書くことでループにラベルを付けることができます。

ラベルを付けることでどんなことができるのか？

**コードの可読性が上がります。**

繰り返し処理を中断する場合、通常は`break`を使いますが、
下のように、`continue xLoop`と明示することで
どのループに処理がいくのかを瞬時に把握することができます。




```swift
xLoop:for x in 0...5 {
  yLoop:for y in 0...5 {
    if (x<y){
      print("\n")
      continue xLoop // yLoopのfor文処理を中断して、xLoopのfor文に抜ける。
    }
    print((x,y))
  }
}
```
```lang:出力
(0, 0)
(1, 0)(1, 1)
(2, 0)(2, 1)(2, 2)
(3, 0)(3, 1)(3, 2)(3, 3)
(4, 0)(4, 1)(4, 2)(4, 3)(4, 4)
(5, 0)(5, 1)(5, 2)(5, 3)(5, 4)(5, 5)
```

また、下記のように`break xLoop`とすると
xLoopのループを中断させることができます。

**つまり、内側のループから外側のループをbreakすることができます。**

```swift
xLoop:for x in 0...5 {
  yLoop:for y in 0...5 {
    if (x<y){
      print("\n")
      break xLoop // yLoopのfor文処理を中断して、xLoopのfor文に抜ける。
    }
    print((x,y))
  }
}
```
```lang:出力
(0, 0)
```