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

  • 88
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ループ処理

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)