Swiftのsleep関数を完全理解!初心者のための8選の使い方

Swiftのsleep関数の使い方を解説するイラストSwift
この記事は約16分で読めます。

 

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

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

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

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

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

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

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

はじめに

SwiftはiOS、macOS、watchOS、tvOSなどのApple製品の開発言語として広く使用されています。

開発を進めていく中で、プログラムの進行を一時的に停止させる必要が生じることがあります。

特に初心者の方が最初に出会うのがsleep関数です。

この記事では、Swiftのsleep関数を初心者向けに徹底解説し、実用的なサンプルコードを通して、効果的なプログラムの休止を実現する方法を解説します。

●Swiftのsleep関数とは

Swiftのsleep関数は、プログラムの実行を指定された秒数だけ休止させる関数です。

この関数は、特定の操作が完了するのを待つためや、ある一定の間隔で処理を実行するためなど、様々なシチュエーションで利用されます。

○sleep関数の基本

sleep関数は非常にシンプルな関数で、使用方法も簡単です。

引数に指定した秒数の間、処理を停止します。

ただし、この関数の引数は秒ではなく、秒を表すUInt32型の値をとります。

例えば、3秒間プログラムを休止させたい場合、下記のように記述します。

sleep(3)  // 3秒間、プログラムを停止します。

上記のコードを実行すると、プログラムは3秒間待機した後に次の処理に移ります。

○sleepとThread.sleepの違い

Swiftではsleep関数の他に、Thread.sleepというメソッドも提供されています。

これらは似ているように思えるかもしれませんが、動作や使用場面が異なります。

sleep関数は、現在のスレッド全体を指定された秒数だけ停止させます。

これに対して、Thread.sleepメソッドは、特定のスレッドだけを停止させることができます。

Thread.sleepメソッドの使用例は次の通りです。

Thread.sleep(forTimeInterval: 3.0)  // 3秒間、現在のスレッドを停止します。

Thread.sleepメソッドの引数は、TimeInterval型(Double型の別名)を使用し、小数点以下の時間も指定することができます。

これに対して、sleep関数は整数のみを受け付けるため、より細かい時間を指定したい場合はThread.sleepメソッドを使用すると良いでしょう。

しかし、sleep関数の方が使いやすく、初心者には特におすすめです。

一方で、マルチスレッド環境での動作や、特定のスレッドだけを制御したい場合は、Thread.sleepメソッドの方が適しています。

使用する際には、それぞれの特性を理解し、適切なものを選択するよう心がけましょう。

●sleep関数の使い方

Swiftのsleep関数は、指定した秒数だけプログラムの実行を一時停止するための関数です。

一見シンプルに見えるこの関数も、適切に使いこなすことでプログラムの効果的な動作をサポートします。

ここでは、初心者でも理解しやすいように、sleep関数の具体的な使い方を3つのサンプルコードを交えて解説します。

○サンプルコード1:基本的な使い方

このコードではsleep関数を使ってプログラムを一時的に2秒間停止するコードを表しています。

この例では、メッセージを表示した後、2秒間の待機を行ってから次のメッセージを表示しています。

import Foundation

print("処理を開始します。")
sleep(2)
print("2秒後、処理を再開しました。")

このコードを実行すると、まず”処理を開始します。”というメッセージが表示されます。

その後、2秒間の一時停止が行われ、”2秒後、処理を再開しました。”というメッセージが表示されるでしょう。

○サンプルコード2:繰り返し処理の中での使い方

このコードでは、forループとsleep関数を組み合わせて、繰り返し処理の間に1秒の待機時間を設ける例を表しています。

この例では、3回の繰り返し処理の間に、それぞれ1秒ずつ待機する動作を行っています。

import Foundation

for i in 1...3 {
    print("\(i)回目の処理")
    sleep(1)
}
print("繰り返し処理が終了しました。")

実行すると、”1回目の処理”というメッセージが表示され、1秒の待機後、”2回目の処理”、さらに1秒待機して”3回目の処理”という順番でメッセージが表示されます。

最後に”繰り返し処理が終了しました。”というメッセージが表示されるでしょう。

○サンプルコード3:エラー処理との組み合わせ

このコードでは、エラー発生時に一時的に処理を停止する例を表しています。

この例では、エラーが発生した場合、エラーメッセージを表示してから、3秒の待機を行った後、再度エラーチェックを行う動作をしています。

import Foundation

var isErrorOccurred = true

while isErrorOccurred {
    print("エラーが発生しました。3秒後に再チェックします。")
    sleep(3)
    // ここで何らかのエラーチェック処理
    isErrorOccurred = false // サンプルのため、エラーチェックは省略し、強制的にエラーを解消することとします。
}
print("エラーが解消されました。")

このコードの場合、初めに”エラーが発生しました。3秒後に再チェックします。”というメッセージが表示されます。

3秒後、”エラーが解消されました。”というメッセージが表示されることとなります。

●sleep関数の応用例

Swiftのsleep関数は、プログラムの実行を一時停止するためのものです。

この機能を活かして、さまざまなシーンで効果的に使用できます。

ここでは、その応用例をいくつか取り上げて、具体的な使い方を解説していきます。

○サンプルコード4:ユーザーインタラクションとの組み合わせ

ユーザーインタラクション、例えばボタンのクリックに応じて、一定時間プログラムを停止させる場合にsleep関数を使用できます。

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!

    @IBAction func buttonClicked(_ sender: UIButton) {
        // ボタンがクリックされたら、2秒間プログラムを停止
        sleep(2)
        print("ボタンがクリックされた後、2秒後にこのメッセージが出力されます")
    }
}

このコードでは、ボタンがクリックされた際にsleep関数を使って、2秒間の一時停止を実施しています。

この例では、ボタンがクリックされた後、2秒待ってからメッセージがコンソールに出力されることになります。

○サンプルコード5:非同期処理での使用例

非同期処理の中でsleep関数を利用することで、一部の処理を一時的に遅延させることができます。

ここでは、非同期タスクの途中で一時停止を入れる例を紹介します。

import Dispatch

DispatchQueue.global().async {
    print("非同期処理を開始します")

    // 非同期タスク中で3秒間の一時停止
    sleep(3)

    DispatchQueue.main.async {
        print("非同期処理が完了し、メインスレッドに戻りました")
    }
}

このコードでは、非同期での処理を開始した後、sleep関数で3秒間の一時停止を挟んでいます。

その後、メインスレッドに処理を戻してメッセージを出力しています。

この例では、非同期処理が開始された後、3秒待ち、そしてメインスレッドに処理が戻る流れを表現しています。

○サンプルコード6:データの取得を待つ場面での使い方

Swiftを使用してアプリケーションを開発する際、特定のデータの取得を待つようなシチュエーションは多く存在します。

例えば、データベースからのデータ取得や外部APIからのレスポンス待ちなど、さまざまなシチュエーションでデータの取得を待つ必要があります。

このような場面で、sleep関数を適切に使用することで、ユーザーエクスペリエンスを向上させることができます。

ここでは、データベースからのデータ取得を待つ場面でのsleep関数の使い方のサンプルコードを紹介します。

import Foundation

func fetchDataFromDatabase() -> String? {
    // 仮にデータベースからデータ取得に3秒かかるとします。
    sleep(3)
    return "データベースから取得したデータ"
}

print("データ取得を開始します。")
if let data = fetchDataFromDatabase() {
    print("取得したデータ:\(data)")
} else {
    print("データ取得に失敗しました。")
}

このコードでは、fetchDataFromDatabase関数を使ってデータベースからデータを取得しています。

この例では、データベースからデータを取得する際に3秒の待機時間が発生すると仮定して、sleep関数で3秒間のプログラムの実行を停止しています。

その後、取得したデータをprint関数で表示しています。

このコードを実行すると、次のような結果が得られます。

データ取得を開始します。
3秒の待機時間が経過した後…
取得したデータ:データベースから取得したデータ

○サンプルコード7:アニメーションとの組み合わせ

Swiftでのアニメーション実装においても、sleep関数は有効に利用することができます。

例えば、アニメーションの途中で一時停止させたい場合や、アニメーションの開始を遅延させたい場合などに、sleep関数を使って制御することが可能です。

ここでは、アニメーションの開始を遅延させるためのsleep関数の使い方のサンプルコードを紹介します。

import UIKit

class AnimationViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let sampleView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        sampleView.backgroundColor = .red
        self.view.addSubview(sampleView)

        print("アニメーション開始前の待機を開始します。")
        sleep(2)
        print("アニメーションを開始します。")

        UIView.animate(withDuration: 2.0) {
            sampleView.center = self.view.center
        }
    }
}

このコードでは、AnimationViewControllerというUIViewControllerのサブクラスを定義しています。

このクラス内で、赤い四角形のビューを画面の中央にアニメーション移動させる処理を実装しています。

アニメーションの開始前に、sleep関数を使って2秒間の待機を行っています。

このコードを実行すると、次のような結果が得られます。

アニメーション開始前の待機を開始します。
2秒の待機時間が経過した後…
アニメーションを開始します。

そして、赤い四角形のビューが画面の中央にアニメーション移動します。

○サンプルコード8:外部APIコールの待機時に使用

外部APIとの通信は、ネットワークの状況やAPIサーバーの状況によって、レスポンスに時間がかかることがあります。

特定の外部APIのレスポンスを待つ必要がある場面で、ユーザーに待機を知らせるためや、一時的な待機を行う場合に、sleep関数を使用することができます。

ここでは、外部APIコールの待機時にsleep関数を使用するサンプルコードを紹介します。

import Foundation

func callExternalAPI() -> String? {
    // 仮に外部APIコールに5秒かかるとします。
    sleep(5)
    return "外部APIから取得したデータ"
}

print("外部APIへのコールを開始します。")
if let data = callExternalAPI() {
    print("取得したデータ:\(data)")
} else {
    print("データ取得に失敗しました。")
}

このコードでは、callExternalAPI関数を使って外部APIからデータを取得しています。

この例では、外部APIからのデータ取得に5秒の待機時間が発生すると仮定して、sleep関数で5秒間のプログラムの実行を停止しています。

その後、取得したデータをprint関数で表示しています。

このコードを実行すると、次のような結果が得られます。

外部APIへのコールを開始します。
5秒の待機時間が経過した後…
取得したデータ:外部APIから取得したデータ

●注意点と対処法

Swiftのsleep関数を使う際、知っておくべきいくつかの注意点があります。

これらの注意点を理解することで、プログラムの安定性や効率性を高めることができます。

○処理のブロックとその影響

Swiftのsleep関数は、指定した時間だけプログラムの実行を停止させます。

これにより、処理が一時的にブロックされるため、他のタスクやイベントが適切に処理されない場合があります。

例えば、UIの更新やユーザーからの入力を受け付けるアプリケーションでsleep関数を使うと、その期間ユーザーの操作が反映されなくなる可能性があります。

import UIKit

class ViewController: UIViewController {
    @IBAction func buttonPressed(_ sender: UIButton) {
        // 3秒間のスリープ
        sleep(3)
        // ボタンが押された後の処理
        sender.setTitle("ボタンが押されました", for: .normal)
    }
}

このコードでは、ボタンが押されたときに3秒間sleepするようになっています。

この期間中、アプリケーションは他のユーザーの操作を受け付けません。

この例ではボタンが3秒間反応しなくなります。

○他のメソッドとの競合

sleep関数を使用している間、他のメソッドやタスクが待機状態になることが考えられます。

これは特にマルチスレッド環境や非同期処理を行っている場合に注意が必要です。

例として、非同期処理でデータの取得を行い、その後にsleep関数を使用して待機する場面を考えてみましょう。

import Foundation

DispatchQueue.global().async {
    // 非同期でデータ取得
    let data = fetchDataFromServer()
    // データ取得後に2秒間スリープ
    sleep(2)
    // その後の処理
    processData(data)
}

この例では、データの取得後に2秒間スリープしていますが、この間に他の処理がブロックされることがあります。

○sleep関数の過度な使用とそのリスク

sleep関数を過度に使用すると、アプリケーションの応答性が低下するリスクがあります。

特に、長い時間のスリープは、アプリケーションがフリーズしているようにユーザーに感じさせる可能性があります。

また、リソースの消費やバッテリーの消耗が早まる場合があります。

このため、必要な場面でのみsleep関数を使用し、過度な使用は避けるよう心がけましょう。

短い時間のスリープは問題になりにくいですが、長時間のスリープや連続してスリープを行う場合は、他の方法を検討することをおすすめします。

●カスタマイズ方法

Swiftのsleep関数は、非常にシンプルな機能を提供していますが、ある程度のカスタマイズや変更を望む場面もあるでしょう。

ここでは、sleep関数のカスタマイズ方法を2つの主要なアプローチを中心に詳しく解説します。

○カスタムsleep関数の作成

Swiftでsleep関数の動作をカスタマイズしたい場面は多々あります。

例えば、特定の条件下でのみスリープを行う、あるいはスリープ時間を動的に変更するなどの要件が考えられます。

そんな時は、自分自身でカスタムsleep関数を作成するのがおすすめです。

ここでは、特定の条件下でのみスリープを行うカスタムsleep関数の一例を紹介します。

このコードでは、引数で与えられた条件がtrueの場合のみ、スリープを実行するコードを表しています。

この例では、条件が真の場合にのみスリープを行い、それ以外の場合は何も実行しないという振る舞いをしています。

func customSleep(duration: UInt32, condition: Bool) {
    if condition {
        sleep(duration)
    }
}

このカスタム関数を使うことで、次のような実行が可能になります。

let shouldSleep = true
customSleep(duration: 2, condition: shouldSleep) // shouldSleepがtrueのため、2秒間スリープします。

この例から、カスタムsleep関数を作成することで、自分の要件に合わせてスリープの動作を柔軟に制御することができることがわかります。

○外部ライブラリとの組み合わせ

Swiftのコミュニティは活発であり、多くの外部ライブラリやフレームワークが提供されています。

sleep関数に関連する機能を持つ外部ライブラリも存在し、それらを利用することで、更に高度なカスタマイズや拡張が可能となります。

例えば、PromiseKitというライブラリでは、非同期処理を簡単に扱うことができ、さらにそれと組み合わせて特定の時間だけ待機するような処理もサポートされています。

ここでは、PromiseKitを使用して非同期のスリープを実現するサンプルコードを紹介します。

このコードでは、after(seconds:)というメソッドを使って、指定された秒数後に処理を実行するコードを表しています。

この例では、3秒後に”Hello, World!”というメッセージを表示するという動作をしています。

import PromiseKit

after(seconds: 3).done {
    print("Hello, World!")
}

// 上記のコードを実行すると、3秒後に"Hello, World!"が表示されます。

このように、外部ライブラリを利用することで、Swiftの標準のsleep関数だけでは実現困難な高度な制御やカスタマイズも行うことができるようになります。

まとめ

Swiftのsleep関数は、プログラムを一時的に休止するための便利なツールです。

今回の記事では、その基本的な使い方からカスタマイズ方法、さらには外部ライブラリとの組み合わせによる応用例までを詳しく解説しました。

特にカスタムsleep関数の作成や外部ライブラリとの組み合わせは、要件に合わせてsleep関数を柔軟に利用する際の参考となるでしょう。

プログラミングにおいて、効果的な休止は多くの場面で重要となるため、これらの知識を活用して、より良いプログラムを作成してみてください。