読み込み中...

Swiftでの繰り返し処理のたった12の方法

Swiftのロゴと繰り返しのアイコンを組み合わせたイメージ Swift
この記事は約17分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swiftを学び始めたばかりの初心者や、あるいは少し経験がある方でも、繰り返し処理の書き方やその適切な使用方法について深く掘り下げたいと考えている方は多いでしょう。

繰り返し処理は、プログラミングにおける基本的な概念の一つであり、効率的なコードを書くためには必須のスキルとなっています。

この記事を読むことで、Swiftにおける繰り返し処理の基本から応用まで、しっかりとした知識と実践的なスキルを身につけることができるようになります。

●Swiftの繰り返し処理とは

Swiftにおける繰り返し処理とは、同じ処理を何度も繰り返すための方法です。

例えば、配列のすべての要素に対して処理を行う、特定の条件が満たされるまで処理を続ける、など様々な場面で利用されます。

Swiftには、for-in文やwhile文、repeat-while文など、繰り返し処理を行うためのさまざまな文法が提供されており、それぞれの文法には独自の特性や適用シーンがあります。

○基本的なループの種類

Swiftで利用できる繰り返し処理の方法は大きく3つに分けられます。

  1. for-in文:指定した回数や、コレクションの要素数分だけ、処理を繰り返します。
  2. while文:指定した条件が満たされている間、処理を繰り返します。
  3. repeat-while文:一度は処理を実行し、その後、指定した条件が満たされている間、処理を繰り返します。

これらの基本的なループの種類について、次のセクションで具体的なサンプルコードとともに詳しく解説していきます。

どのループを選ぶべきかは、達成したい目的や状況に応じて変わってきます。

適切なループを選択することで、コードの可読性を高め、バグの発生を抑えることができます。

●Swiftの繰り返し処理の使い方

Swiftにおける繰り返し処理の使い方を理解するためには、まず基本的なループの構造を知ることが重要です。

ここでは、Swiftで頻繁に使われる繰り返し処理の文法について、実際のサンプルコードを交えて詳しく解説していきます。

○サンプルコード1:for-in文での基本的なループ

for-in文は、Swiftで最も基本的な繰り返し処理の形式の一つです。

これを使うことで、特定の回数やコレクションの要素数だけ、指定した処理を繰り返すことができます。

// 1から5までの数字を順番に出力するサンプル
for i in 1...5 {
    print(i)  // 数字を出力
}

このコードでは、1から5までの数字を順番に出力しています。

具体的には、for i in 1...5という部分で、1から5までの範囲を指定してループを行い、print(i)でその数値を出力しています。

実行すると、次のような結果が得られます。

1
2
3
4
5

この結果から、for-in文が指定した範囲の数値を順番に取り出し、その都度指定した処理を行っていることがわかります。

○サンプルコード2:while文を用いた繰り返し

while文は、指定した条件が真である間、繰り返し処理を行うための文法です。

条件が偽になると、ループは終了します。

// 1から始めて、数字を2倍にして10を超えるまで出力するサンプル
var number = 1
while number <= 10 {
    print(number)
    number *= 2  // 数字を2倍にする
}

このコードでは、numberという変数の値が10以下の間、その値を出力し続けています。

そして、毎回の繰り返しの後でnumberの値を2倍にしています。

実行すると、次のような結果が得られます。

1
2
4
8

この結果から、while文が指定した条件を満たしている間、指定した処理を繰り返し行っていることが確認できます。

また、条件を満たさなくなった時点でループが終了していることもわかります。

○サンプルコード3:repeat-while文の利用方法

repeat-while文は、Swiftにおける繰り返し処理の一つで、特定の条件が偽の間、指定された処理を実行し続ける特性を持っています。

特徴としては、まず指定された処理が一度実行され、その後で条件を評価します。

これにより、条件が初めから偽であっても、処理は必ず一度は実行される点が特筆されます。

// 0から始め、5になるまでの数値を出力するサンプル
var counter = 0
repeat {
    print(counter) // 現在のcounterの値を出力
    counter += 1   // counterの値を1増やす
} while counter < 5

このコードを実行すると、counterの初期値が0であるため、まず0が出力されます。

その後、counterの値が1ずつ増えていき、4までの数値が順番に出力されると考えられます。

実際には、このような結果になります。

0
1
2
3
4

このように、repeat-while文を使うことで、条件を後から評価する繰り返し処理を実現することができます。

特に、処理が最低一回は実行される必要がある場合に、この文法は非常に有効です。

○サンプルコード4:配列の要素を順番に処理する方法

Swiftでは配列も繰り返し処理の対象として扱うことができます。

for-in文を使用して、配列の各要素に対して順番に処理を行うことが可能です。

// 文字列の配列を作成し、その要素を順番に出力するサンプル
let fruits = ["apple", "banana", "cherry"]
for fruit in fruits {
    print(fruit)  // 配列の要素を出力
}

このコードでは、文字列の配列fruitsを作成し、その中の要素を順番に出力しています。

実行すると、次のような結果となります。

apple
banana
cherry

このように、Swiftのfor-in文を使用することで、配列の要素を順番に処理することが非常に簡単にできます。

特に、大量のデータを持つ配列を扱う際には、この方法が非常に有効であることがわかります。

●Swiftの繰り返し処理の応用例

Swiftの繰り返し処理は基本的なものだけでなく、さまざまな応用的なシーンで役立ちます。

ここでは、より実践的な繰り返し処理の方法をいくつか紹介していきます。

○サンプルコード5:二次元配列と繰り返しの組み合わせ

二次元配列とは、配列の中にさらに配列が格納されているデータ構造を指します。

Swiftでは、この二次元配列を繰り返し処理する場合、外側の配列と内側の配列を同時にループ処理することができます。

// 二次元配列のサンプル
let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

// 二次元配列の要素を順番に出力
for row in matrix {
    for value in row {
        print(value)  // 各要素を出力
    }
}

このコードの中では、最初に外側の配列(matrix)を繰り返し処理し、次に内側の配列(row)を繰り返し処理しています。

実行すると、1から9までの数値が順番に出力される結果になります。

1
2
3
4
5
6
7
8
9

○サンプルコード6:繰り返し処理での条件分岐

繰り返し処理中に、特定の条件を満たす要素だけに対して処理を行いたい場合があります。

このような場合、条件分岐を使用して、繰り返し処理をカスタマイズすることができます。

// 1から10までの数値の中で、偶数だけを出力するサンプル
for number in 1...10 {
    if number % 2 == 0 {
        print(number)  // 偶数を出力
    }
}

このコードを実行すると、2, 4, 6, 8, 10という偶数だけが順に出力される結果となります。

2
4
6
8
10

○サンプルコード7:繰り返し内での関数の呼び出し

Swiftの繰り返し処理中に関数を呼び出すことで、コードの再利用性や可読性を高めることができます。

関数を使用することで、繰り返し処理の中の具体的なタスクを分離・独立させることが可能となります。

ここでは、配列の各要素に対して特定の関数を実行するシンプルな例を紹介します。

// 関数の定義: 数値を2倍にして出力する
func doubleAndPrint(value: Int) {
    print(value * 2)  // 数値を2倍にして出力
}

// 配列の定義
let numbers = [1, 2, 3, 4, 5]

// 関数を繰り返し処理の中で呼び出し
for num in numbers {
    doubleAndPrint(value: num)
}

このコードでは、doubleAndPrint関数は引数として受け取った数値を2倍にして出力します。

続いて、配列numbersの各要素に対して、この関数を実行しています。

実行すると、配列の各要素が2倍にされて出力されます。

2
4
6
8
10

○サンプルコード8:辞書型データの繰り返し処理

Swiftにおける辞書型データは、キーと値のペアでデータを管理します。

この辞書型のデータも繰り返し処理を用いて、各要素を順番に取り出して処理することができます。

ここでは、辞書型のデータを繰り返し処理で取り出して、それぞれのキーと値を出力する例を紹介します。

// 辞書型データの定義
let fruits = ["apple": "りんご", "banana": "バナナ", "cherry": "さくらんぼ"]

// キーと値を繰り返し処理で取り出し
for (english, japanese) in fruits {
    print("\(english)は日本語で\(japanese)です。")  // キーと値を組み合わせて出力
}

このコードを実行すると、辞書に格納された各キーと値のペアが順番に出力されます。

appleは日本語でりんごです。
bananaは日本語でバナナです。
cherryは日本語でさくらんぼです。

○サンプルコード9:繰り返し処理を使ったアニメーション

Swiftでは、繰り返し処理を利用してアニメーションを実現することが可能です。

例えば、一連の画像を連続して表示することで、動くアニメーションを表現することができます。

ここでは、繰り返し処理を使って連続的に画像を表示し、アニメーションのように見せるシンプルなサンプルコードを紹介します。

import UIKit

class AnimationViewController: UIViewController {

    var imageView: UIImageView!
    var imageArray: [UIImage] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // 画像の配列を作成
        for i in 1...5 {
            if let image = UIImage(named: "frame\(i)") {
                imageArray.append(image)  // 画像を配列に追加
            }
        }

        imageView = UIImageView(frame: self.view.bounds)
        imageView.animationImages = imageArray  // アニメーションに使う画像の配列を指定
        imageView.animationDuration = 1.0       // アニメーションの全体の時間を指定
        imageView.startAnimating()              // アニメーションを開始

        self.view.addSubview(imageView)
    }
}

このコードでは、imageArrayという配列に連続する5枚の画像を格納しています。

その後、UIImageViewanimationImagesプロパティにこの配列を設定することで、画像が連続して表示されるアニメーションを実現しています。

このサンプルコードを実行すると、画面上にframe1からframe5までの画像が1秒間隔で順番に表示されるアニメーションが再生されます。

○サンプルコード10:ループを使った計算処理の最適化

計算処理を行う際、繰り返し処理をうまく利用することで、効率的な計算が可能となります。

特に、同じ計算を複数回行う場合や、順序に意味がある計算を行う際には、繰り返し処理が非常に役立ちます。

ここでは、繰り返し処理を利用して、1から100までの数値を合計するサンプルコードを紹介します。

var total = 0  // 合計値を保存する変数

// 1から100までの数値を合計
for i in 1...100 {
    total += i  // 合計値にiを加算
}

print("1から100までの合計は\(total)です。")

このコードを実行すると、1から100までの合計、5050が出力されます。

○サンプルコード11:非同期処理との組み合わせ

Swiftの繰り返し処理と非同期処理は、さまざまな場面で一緒に利用されます。

特に、データの取得や計算処理を非同期で行いながら、その結果を連続して処理する際にはこの組み合わせが役立ちます。

非同期処理は、処理が完了するのを待たずに次の処理に進むことができるため、効率的なプログラムを書くのに有効です。

Swiftでは、DispatchQueueを使用して非同期処理を制御することができます。

下記のサンプルコードは、非同期処理と繰り返し処理を組み合わせて、配列の各要素を非同期に処理する例です。

import Foundation

let items = [1, 2, 3, 4, 5]

// DispatchQueueのglobalキューを取得
let queue = DispatchQueue.global()

for item in items {
    // 非同期処理を追加
    queue.async {
        print("非同期で処理中: \(item)")
        sleep(2) // 2秒待機(処理のシミュレーションのため)
    }
}

print("全ての非同期処理を開始しました。")

このコードを実行すると、まず「全ての非同期処理を開始しました。」が表示され、その後非同期でitemsの各要素が処理され、「非同期で処理中: (item)」と表示されます。

非同期処理のため、全ての要素がほぼ同時に処理される点に注意が必要です。

○サンプルコード12:繰り返し処理でのエラーハンドリング

繰り返し処理中にエラーが発生する可能性がある場合、Swiftのエラーハンドリング機能を利用して、適切にエラーをキャッチして対応することが求められます。

下記のサンプルコードは、繰り返し処理の中で発生するエラーをキャッチして処理する例です。

enum SampleError: Error {
    case invalidValue
}

func processValue(_ value: Int) throws {
    if value <= 0 {
        throw SampleError.invalidValue  // 0以下の値が入力された場合エラーを投げる
    }
    print("正常に処理: \(value)")
}

let values = [1, -2, 3, -4, 5]

for value in values {
    do {
        try processValue(value)  // エラーが投げられる可能性がある関数を実行
    } catch SampleError.invalidValue {
        print("エラー: 値\(value)は不正です。")
    } catch {
        print("不明なエラーが発生しました。")
    }
}

このコードを実行すると、正の数値は「正常に処理: (value)」と表示され、負の数値の場合は「エラー: 値(value)は不正です。」というエラーメッセージが表示されます。

●Swiftの繰り返し処理の注意点と対処法

Swiftを使ってプログラミングを行う際、繰り返し処理は非常に頻繁に使われる要素の一つです。

しかしその便利さの裏には、注意すべき点や落とし穴が潜んでいます。

ここでは、Swiftでの繰り返し処理の際に気をつけるべき点と、それを避けるための対処法を説明します。

○無限ループの発生

一般的なプログラミングの課題として、繰り返し処理中に意図しない無限ループが発生することがあります。

特にwhile文やrepeat-while文を使用する際には注意が必要です。

var i = 0
// 誤った条件式による無限ループ
while i != 10 {
    print(i)
    // iが増加しないため、ループが永遠に続く
}

上記のコードでは、iの値が増加しないため、条件式i != 10が常にtrueとなり、無限ループが発生します。

これを避けるためには、ループ内での変数の変更を適切に行うことが重要です。

○配列やコレクションの範囲外アクセス

for-in文を使って配列やコレクションの要素を繰り返し処理する際、存在しないインデックスにアクセスしようとすると、実行時エラーが発生します。

let array = [1, 2, 3]
// 誤った範囲指定によるエラー
for i in 0...4 {
    print(array[i])  // インデックス3と4は存在しないためエラー
}

上記のコードでは、配列arrayにはインデックス3と4が存在しないため、エラーが発生します。

これを避けるためには、配列の長さを正確に取得し、その範囲内での繰り返しを行うことが大切です。

○変更不可能な変数の変更

letキーワードを使用して宣言された変数は変更不可能です。

しかし、繰り返し処理の中でこれを変更しようとするとエラーが発生します。

let numbers = [1, 2, 3]
for var number in numbers {
    number += 1  // letで宣言された変数は変更不可のためエラー
    print(number)
}

上記のコードでは、変更不可能な変数numberを変更しようとしているため、エラーが発生します。

これを避けるためには、varキーワードを使用して変数を宣言するか、新しい変数を使用することで対処可能です。

●カスタマイズ方法

Swiftの繰り返し処理は非常に強力で、さまざまなシチュエーションで使用されます。

しかし、プロジェクトの要件に合わせて繰り返し処理をカスタマイズすることも可能です。

ここでは、Swiftの繰り返し処理をより柔軟に、そして効果的に利用するためのカスタマイズ方法を取り上げます。

○特定の条件下での繰り返しスキップ

continueキーワードを使用すると、ループの現在のイテレーションをスキップして、次のイテレーションに進むことができます。

// 5の倍数の時だけスキップするサンプルコード
for i in 1...10 {
    if i % 5 == 0 {
        continue
    }
    print(i)
}

このコードでは、1から10までの数字を出力しますが、5の倍数のときだけスキップされます。実際には、1,2,3,4,6,7,8,9 という順序で数字が出力されます。

○特定の条件でループを終了

breakキーワードを使用すると、ループを完全に終了することができます。

特定の条件が満たされたときにループを終了させる場面で役立ちます。

// 5を見つけたらループを終了するサンプルコード
for i in 1...10 {
    if i == 5 {
        break
    }
    print(i)
}

このコードでは、1から5までの数字が出力された後、ループが終了します。

その結果、1,2,3,4という順序で数字が出力され、5以降は出力されません。

○繰り返しのインデックスを使用

enumerated()メソッドを使用すると、ループの各イテレーションでインデックスと要素の両方にアクセスできます。

let fruits = ["apple", "banana", "cherry"]
// 要素とそのインデックスを出力するサンプルコード
for (index, fruit) in fruits.enumerated() {
    print("インデックス\(index)の果物は\(fruit)です。")
}

このコードを実行すると、「インデックス0の果物はappleです。」、「インデックス1の果物はbananaです。」、「インデックス2の果物はcherryです。」という順序で文が出力されます。

まとめ

Swiftでの繰り返し処理は、プログラミングにおいて非常に基本的かつ重要な概念です。

この記事を通して、Swiftの繰り返し処理の基本から、その応用、注意点、さらにはカスタマイズ方法までを詳しく学ぶことができたかと思います。

Swiftの繰り返し処理は、その強力さと多様性から、日常的な開発の中で頻繁に遭遇するものです。

この記事が、Swiftの繰り返し処理をより深く理解し、実際の開発に役立てるための参考資料となれば幸いです。

プログラムの効率や品質を向上させるために、繰り返し処理の知識と技術を活用してください。