#はじめに
今回はプログラムの基本である繰り返しの方法について紹介します。
多少書き方の違いはありますがSwift以外の多言語全てで使用されるプログラムの基本構文の1つです。
この投稿で書き方をしっかりと覚えておいてください。
繰り返しとは
プログラムでは同じ処理を何度も繰り返して実行することが多くあります。
そんなときに繰り返し処理であるfor
やwhile
を使います。
例えば簡単な例でいくと、あるStringを格納した配列が定義されており、その内容全てを表示したいとします。
繰り返しを使わなければ以下のようになります。
var fruitsList = ["りんご", "みかん", "スイカ"]
print(fruitsList[0]) // りんご
print(fruitsList[1]) // みかん
print(fruitsList[2]) // スイカ
この配列の要素が100個になると100回print()
を記述しなければなりません。
またプログラムの実行中にstringList
に要素が追加された場合、その追加された要素に対して処理することができません。
そんなときに繰り返し制御を行って解決します。
for文
for
の構文は以下となります。
for 定数 in 配列 {
繰り返す処理
}
for
文は上記の書き方をすると配列の0番目から要素が取り出され、定数に格納されます。
取り出された後処理ブロック内に書かれた処理を実行します。
配列の最後まで要素を取り出し処理が完了すると繰り返しが終了します。
最初の例をfor
を使って書き直してみます。
var fruitsList = ["りんご", "みかん", "スイカ"]
for fruits in fruitsList {
print(fruits)
}
りんご
みかん
スイカ
また直接配列のインデックスを指定しているわけではないので、要素が追加されても対応できます。
var fruitsList = ["りんご", "みかん", "スイカ"]
for fruits in fruitsList {
print(fruits)
}
print("--- 要素を追加 ---")
fruitsList.append("パイナップル")
fruitsList.append("いちご")
for fruits in fruitsList {
print(fruits)
}
りんご
みかん
スイカ
--- 要素を追加 ---
りんご
みかん
スイカ
パイナップル
いちご
指定回数繰り返す
次の例は指定回数処理を繰り返す方法です。
※多言語のようなインデックスをインクリメントする方法はありません。
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
実はこの処理は先程説明した要素を取り出す方法と同じです。
今回配列部分に1...10
と指定しました。
これは1~10のInt
型配列を作る書き方です。
そのため作られた10要素を持つ配列から1つずつ要素が取り出されたというわけです。
(正確には配列ではなくRange<Int>
という型です)
辞書型をfor文で処理する
辞書型も配列と同様にfor
文で処理できます。
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
の構文は以下となります。
while 継続条件 {
繰り返す処理
}
継続条件はif
文のようにBool
型で与える必要があります。
継続条件がfalse
となったタイミングで処理を抜けます。
以下の例は整数を1ずつ足していき、合計が10になったら繰り返しを終了する処理です。
var sum = 0
while sum < 10 {
sum += 1
print("合計: \(sum)")
}
合計: 1
合計: 2
合計: 3
合計: 4
合計: 5
合計: 6
合計: 7
合計: 8
合計: 9
合計: 10
気をつけたいことは今回の例では発生することはあり得ませんが、条件文が常にtrue
になってしまうと無限ループが発生してしまいます。
無限ループが発生するとそれ以降の処理は一切実行されず、アプリはフリーズしてしまいます。
簡単に無限ループさせるには以下のようにします。
※実行すると永遠に処理が走るので実行はおすすめしません。実行したとしても適度なタイミングでプログラムを停止してください。
while true {
sum += 1
print("合計: \(sum)")
}
継続条件に固定値としてtrue
が入っているので処理を抜けることはありません。
これは単純な例ですが、複雑な条件や処理になると発生してしまうので注意してください。
処理を途中で抜ける
繰り返し処理を行っている中で途中で処理を抜けたいということがたまに発生します。
例えば検索処理などです。
配列の中から見つけたい要素があったら変数に格納し以降の処理は行わない、というように実装したいとします。
その場合break
というものを使い処理ブロックを抜けます。
以下が具体的な実装です。
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の違い
繰り返し処理という意味ではこの2つに違いはありません。
違いとしてはfor
は配列など数が決まっているものに対して行う有限の繰り返しに対し、while
は終了条件を満たすまで繰り返される処理ということです。
C言語などではよく使いますが、Swiftではあまりwhile
文は見かけません。
ですがが、処理を待ち受けたいときなど使う場面もあります。
通信処理などでたまに使うイメージです。
どちらも使えるようにしておきたいところです。
#最後に
今回はSwiftで繰り返し処理を行う方法を紹介しました。
繰り返し処理は条件分岐処理と同様に重要でプログラミングの基礎となる内容なのでこの機会にしっかりと押さえておきましょう。
今回の内容は以上です。
本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載は以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/