LoginSignup
111
119

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-12

ループ処理

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

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

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

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

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

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

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


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

出力
1回目1
2回目3
3回目6
4回目10
5回目15

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

for _ in 1...5 {
  let num = arc4random_uniform(100)
  println(num)
}
出力
10
86
87
93
64

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

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

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

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

Array型の場合


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

Dictionary型の場合

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

for (menu,price) in menuList {
    println("\(menu)\(price)円")
}
出力
cappuccinoは380円
coffeeは320円
moccaは400円
latteは380円
teaは280円

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

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

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

for price in menuList.values {
    println(price)
}
出力
cappuccino
coffee
mocca
latte
tea

380
320
400
380
280

String型の場合

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

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

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

// drinkListの要素分だけループ
for(var i=0; i<drinkList.count; i++) {
    println(drinkList[i])
}
出力
coffee
tea
latte
cappuccino
mocca

while

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

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

var spelUseCount = 5

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

do-while

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

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

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

var result:UInt32

// 乱数resultが50未満であれば、ループする。
do {
    result = arc4random_uniform(100) // 0~99の乱数
} while (result < 50)
出力
22
63 // 50以上のためここで終了

ループにラベルをつける

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

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

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

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

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))
  }
}
出力
(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することができます。

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))
  }
}
出力
(0, 0)
111
119
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
111
119