【Swift】forで繰り返し処理を行う!使い方を解説!
(*このページは2021年2月19日に更新されました。)
Swiftで同じ処理を何回も繰り返したい場合はforを使用します。
例えば、画面に50回文章を表示する必要があるとして、表示するメソッドを50回使用することで実行はできますが、文章を100万回表示する必要があった場合どうしますか?
表示するメソッドを100万回入力しても構いませんが、とても時間がかかって面倒です。
しかし、forを使用すると表示するメソッドを1回書くだけで何度でも実行することができるのです。
また、forの中にforを使用すると多重の繰り返し処理を行うことができ、enumerated()関数を使用するとカウンタを取得することができ、srtideを使用すると開始と終了と間隔を設定して繰り返し処理を行うことができます。
さらに、where句を使用すると、繰り返し処理を行っている最中にフィルタリングを行うことができ、caseを使用すると繰り返し処理を行っている最中にパターンマッチングを行うこともできます。
今回はSwiftのforを使って繰り返し処理を行う方法について以下の内容を解説していきます。
⚫︎ 同じ処理を回数分繰り返す
⚫︎ レンジオブジェクトを取り出す
⚫︎ コレクションの要素を取り出す
⚫︎ 多重ループを使用する
⚫︎ 開始と終了と間隔を設定して繰り返し処理を行う
⚫︎ 繰り返し処理中にフィルタリングを行う
⚫︎ 繰り返し処理中にパターンマッチングを行う
⚫︎ 繰り返し処理でカウンタを取得する
⚫︎ whileで繰り返し処理を行う
目次
forとは
forとは繰り返し処理のことであり、決まった回数分の処理を行う構文となります。
JavaやCを経験されている方はご存知だと思いますが、書き方が少し異なりますので注意してください。
forの書き方
forの構文は下記の2つのようになります。
1 2 3 |
for 変数 in 開始位置...終了位置 { 処理内容 } |
forに開始位置と終了位置を指定すると、開始位置から終了位置までの数値分、繰り返して処理内容を行うようになり、開始位置から終了位置までのインデックスが変数に格納されます。
1 2 3 |
for 変数 in コレクション { 処理内容 } |
forにリストやタプル、辞書、セットなどのコレクションを指定すると、コレクションの中にある要素を取り出すことができます。
forを使った基本的なサンプルコード
forを使った基本的なサンプルコードを紹介します。
同じ処理を回数分繰り返す
forに開始位置と終了位置を指定して、同じ処理を回数分繰り返してみます。
例
1 2 3 4 5 6 7 |
for i in 1...10 { print("処理が実行されました。") } for i in 1..<10 { print("再び処理が実行されました。") } |
出力結果
処理が実行されました。
処理が実行されました。
処理が実行されました。
処理が実行されました。
処理が実行されました。
処理が実行されました。
処理が実行されました。
処理が実行されました。
処理が実行されました。
処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
再び処理が実行されました。
開始位置と終了位置を指定た回数分、処理を行っています。
また、「..< 」とすることで、終了位置を含まない回数分、処理を行うようになります。
その為、「処理が実行されました。」が10回出力され、「再び処理が実行されました。」が9回出力されています。
レンジオブジェクトを取り出す
forで繰り返し処理のレンジオブジェクトを取り出すことができます。
例
1 2 3 4 5 6 7 |
for range1 in 1...10 { print("\(range1)") } for range2 in 33..<45 { print("\(range2)") } |
出力結果
1
2
3
4
5
6
7
8
9
10
33
34
35
36
37
38
39
40
41
42
43
44
変数を出力することで、開始位置から終了位置までのレンジオブジェクトを取り出しています。
しかし、レンジオブジェクトは個数ではなく、開始位置から終了位置までの番号となりますので注意してください。
そのため、「1〜10」と「33〜44」までの番号が表示されています。
コレクションの要素を取り出す
forにコレクションを指定すると、コレクションの要素を取り出すことができます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
let array: [Int] = [2, 4, 6, 8, 10] for num in array { print(num) } let dict: [Int: String] = [1:"東京",2:"神奈川", 3:"埼玉", 4:"千葉"] for item in dict { print(item) } for (key , value) in dict { print("キー: \(key)") print("値: \(value)") } |
出力結果
2
4
6
8
10
(key: 4, value: “千葉”)
(key: 1, value: “東京”)
(key: 3, value: “埼玉”)
(key: 2, value: “神奈川”)
キー: 4
値: 千葉
キー: 1
値: 東京
キー: 3
値: 埼玉
キー: 2
値: 神奈川
開始位置と終了位置を指定た回数分、処理を行っています。
そして、「..< 」とすると終了位置を含まない回数分、処理を行うようになります。
その為、「処理が実行されました。」が10回出力され、「再び処理が実行されました。」が9回出力されています。
また、コレクションの要素の取り出しはforEachでも取り出すことができます。
例
1 2 3 4 5 |
let array: [Int] = [2, 4, 6, 8, 10] array.forEach { print($0) } |
出力結果
2
4
6
8
10
forEachでコレクションの要素の取り出して表示されています。
forを使った応用的なサンプルコード
forを使った応用的なサンプルコードを紹介します。
多重ループを使用する
forの中にforがあることを多重ループといいます。
そのため、2重や3重の繰り返し処理を行うことができます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
for i in 1...9 { for j in 1...9 { let mult = i * j print(mult, terminator: "|") } print("\n") } var array: [[String]] = [["東京", "埼玉", "神奈川", "千葉"], ["大阪", "京都", "兵庫", "奈良"], ["福岡", "大分", "長崎", "佐賀"]] for i in 0...2 { for j in array[i]{ print(j) } } |
出力結果
1|2|3|4|5|6|7|8|9|
2|4|6|8|10|12|14|16|18|
3|6|9|12|15|18|21|24|27|
4|8|12|16|20|24|28|32|36|
5|10|15|20|25|30|35|40|45|
6|12|18|24|30|36|42|48|54|
7|14|21|28|35|42|49|56|63|
8|16|24|32|40|48|56|64|72|
9|18|27|36|45|54|63|72|81|
東京
埼玉
神奈川
千葉
大阪
京都
兵庫
奈良
福岡
大分
長崎
佐賀
多重ループによって九九が作成されています。
また、多次元配列の要素を取り出して表示しています。
開始と終了と間隔を設定して繰り返し処理を行う
forにstrideを使用することで、開始と終了と間隔を設定して繰り返し処理を行うことができます。
fromが初期値、toが終了値、byが増分となります。
例
1 2 3 |
for i in stride(from: 2, to: 20, by: 4) { print(i) } |
出力結果
2
6
10
14
18
strideで、開始位置を2、終了位置を20、間隔を4で設定して繰り返し処理を行っています。
そのため、「2, 4, 10, 14, 18」が表示されています。
繰り返し処理中にフィルタリングを行う
forにwhere句を使用することで、繰り返し処理中にフィルタリングを行うことができます。
例
1 2 3 |
for num in 0...10 where num % 2 == 0 { print(num) } |
出力結果
0
2
4
6
8
10
where句によって、繰り返し処理中にフィルタリングを行っています。
その為、0〜10で偶数のみの数値を取り出して表示しています。
繰り返し処理中にパターンマッチングを行う
forにcaseを使用することで、繰り返し処理中にパターンマッチングを行うことができます。
例
1 2 3 4 5 6 7 8 9 |
enum City { case Tokyo, Osaka, Nagoya } let city: [City] = [.Tokyo, .Osaka, .Nagoya, .Nagoya, .Tokyo] for case .Nagoya in city { print("愛知県名古屋市") } |
出力結果
愛知県名古屋市
愛知県名古屋市
caseによって繰り返し処理中にパターンマッチングを行っています。
そのため、enum内で定義された.Nagoyaは2つあるので、「愛知県名古屋市」が2回表示されています。
繰り返し処理でカウンタを取得する
forにenumerated()関数を組み合わせて使用することで、繰り返し処理でカウンタを取得することができます。
例
1 2 3 4 5 |
let array: [String] = ["りんご", "いちご", "ぶどう", "メロン"] for (index, value) in array.enumerated() { print("\(index) ; \(value)") } |
出力結果
0 ; りんご
1 ; いちご
2 ; ぶどう
3 ; メロン
enumerated()によって繰り返し処理でカウンタを取得することができます。
そのため、配列の要素とインデックスがカウントされて表示されています。
whileで繰り返し処理を行う
また、forだけでなくwhileを使用することでも繰り返し処理を行うことができます。
whileはforと違って、falseになるまで繰り返し処理を行う構文となります。
つまり、Trueがずっと続くようになると無限ループになりますので注意してください。
例
1 2 3 4 5 6 7 8 |
var count = 1 var result = 0 while count <= 10 { result = result + count count = count + 1 } print("合計: \(result)") |
出力結果
合計: 55
whileによって繰り返し処理が行われています。
そのため、1から10までの合計値である「55」が表示されています。
まとめ
forで繰り返し処理を行う
⚫︎ forは繰り返し処理を行う構文である
⚫︎ forは、同じ処理を回数分繰り返したり、レンジオブジェクトを取り出したり、コレクションの要素を取り出したりすることができる
⚫︎ forの中にforを使用することで、2重や3重のなどの多重の繰り返し処理を行うことができる
⚫︎ forにstrideを使用すると、開始と終了と間隔を設定して繰り返し処理を行うことができる
⚫︎ forにwhere句を使用すると、繰り返し処理中にフィルタリングを行うことができる
⚫︎ forにcaseを使用すると、繰り返し処理中にパターンマッチングを行うことができる
⚫︎ forにenumerated()関数を組み合わせて使用すると、繰り返し処理でカウンタを取得することができる
⚫︎ forだけでなく、whileでも繰り返し処理を行うことができる
(forは回数分行うと処理が終了するが、whileはfalseの場合に繰り返し処理が終了する)
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。