iPhone
iOS
Swift

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

More than 3 years have passed since last update.


ループ処理

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)