
Swiftで非同期処理(async/await)を扱う中で、「一定時間でタイムアウトさせたい」「数秒待ってから処理を実行したい」といった時間制御が必要な場面はよくあります。
そうしたときに使われるのが ContinuousClock.Duration です。
この記事では、ContinuousClock.Duration の基本的な意味や使い方、指定方法、活用シーンまでわかりやすく解説します。
ContinuousClock.Duration とは?
ContinuousClock.Duration は、Swiftに標準で用意されている「時間の長さ(Duration)」を表す型です。
これは名前の通り、Swiftの「止まらない時計」こと ContinuousClock に関連付けられた時間単位です。
ポイントは以下の通りです。
- 秒・ミリ秒・ナノ秒などの時間を明示的に指定できる
- 非同期処理でのタイムアウトや遅延実行に使われる
- ContinuousClockと一緒に使う前提で設計されている
たとえば以下のように指定します:
|
1 2 |
let timeout: ContinuousClock.Duration = .seconds(3) |
この書き方で「3秒間の待ち時間」を意味する Duration を作成できます。
初心者向け:なぜ Duration 型が必要?
「3秒なら Int で 3 と書けばよくない?」と思うかもしれません。
しかし、非同期処理や並列処理を活用する上では、「時間の単位」や「扱うクロック」が明確である必要があります。
Duration はただの数値ではなく、時間としての意味や文脈(Clockの種類など)を持つ値です。
つまり、Swiftは安全性・正確性を重視して「時間は Duration 型で書いてね」とルール化しているということです。
具体例:数秒待ってから処理を実行する
数秒待ってから処理を実行するシンプルな例で具体的に確認していきましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import SwiftUI struct ContentView: View { @State private var message = "まだ待機していません" var body: some View { VStack(spacing: 20) { Text(message) .font(.headline) Button("2秒待機する") { Task { // 2秒待機 try? await ContinuousClock().sleep(for: .seconds(2)) message = "2秒経過しました!" } } } .padding() } } #Preview { ContentView() } |
このコードのポイント
ContinuousClock().sleep(for:)に.seconds(2)を渡して、2 秒間だけ待機.seconds(2)はContinuousClock.Duration.seconds(2)の省略形- 実行すると以下のような挙動になります
1234まだ待機していません(ボタンを押す → 2秒待機)2秒経過しました!

このような形でContinuousClock.Durationは使われます。
よく使う指定方法
ContinuousClock.Duration では次のように単位を指定できます:
| 書き方 | 意味 |
|---|---|
.seconds(5) |
5秒 |
.milliseconds(300) |
300ミリ秒(0.3秒) |
.microseconds(1000) |
1000マイクロ秒 |
.nanoseconds(1_000_000_000) |
1秒(10億ナノ秒) |
たとえば 2.5秒を表したいなら次のようにできます:
|
1 2 |
let waitTime: ContinuousClock.Duration = .milliseconds(2500) |
Duration を使う代表的なAPI
Swift 標準ライブラリには、ContinuousClock.Duration を活用できる API がいくつか用意されています。
特に非同期処理(async/await)の待機やタイムアウトを制御する場面でよく使われます。
1. Clock.sleep(for:tolerance:)
指定した時間だけ待機する非同期スリープです。
ContinuousClock() や SuspendingClock() といったクロックと組み合わせて使います。
|
1 2 |
try await ContinuousClock().sleep(for: .seconds(2)) |
for:にContinuousClock.Durationを渡すことで「2秒待機する」という意味になります。toleranceを指定すれば「多少ずれても構わない」という幅を許容できます。- Swift Concurrency で推奨される待機方法 です。
2. Task.sleep(for:)(Swift 5.9 以降)
従来は nanoseconds を指定していましたが、Swift 5.9 以降では Duration が直接指定できるようになりました。
|
1 2 |
try await Task.sleep(for: .seconds(1)) // 1秒待機 |
旧来の
|
1 2 |
try await Task.sleep(nanoseconds: 1_000_000_000) |
よりも読みやすく、Duration ベースで安全に書けます。
活用シーン
ContinuousClock.Duration は「時間を待つ」「制限時間を設ける」といった処理で幅広く使えます。
特に非同期処理やユーザー操作に関連する場面で役立ちます。
- タイムアウト処理(APIリクエストの制限時間)
API 通信が長引いたときに「3秒以上待ったら中断」といった制御に使える。 - 一定時間だけ待ってから処理を開始したい
ローディング画面を 2 秒だけ表示してからメイン画面へ遷移する、などの待機処理に便利。 - アニメーションやサウンドのインターバル制御
アニメーションを 0.5 秒ごとに繰り返す、サウンドを一定間隔で鳴らすといった制御に使える。 - ユーザーの操作待ちやポーリング処理
入力が 3 秒以上止まったら送信する、サーバーに一定間隔で状態確認リクエストを投げる。
このように Duration を使うと、ただ時間を測るだけでなく処理全体の安全性やユーザー体験を改善できます。
ContinuousClock.Duration を使うときの注意点
ContinuousClock.Duration は便利ですが、正しく扱うにはいくつかのポイントを押さえておく必要があります。
- 精度は環境依存 – ナノ秒単位で指定できても、実際はミリ秒〜マイクロ秒精度に制限されることが多い
- ゼロ・負の値 –
.seconds(0)は即時処理、負値は基本的にゼロ扱い - プラットフォーム差 – iOS / macOS / Linux で挙動や精度が微妙に異なる
- 型推論に注意 –
.seconds(1)は便利だが、場面によっては型を明示する必要あり
特に精度や環境依存性に注意しましょう。
まとめ
今回は「時間の長さ(Duration)」を表す型であるContinuousClock.Duration を紹介しました。
ContinuousClock.Durationは Swift の「時計の仕組み(Clock)」に基づく時間指定用の型.seconds(3)などの表記で時間をわかりやすく指定できる- 非同期処理のタイムアウトや遅延実行で頻繁に使う
-
Clock.sleep(for:)などのメソッドで活用される
Swiftの非同期処理をより柔軟かつ安全に扱うためにも、ContinuousClock.Duration を理解しておくことは重要です。
時間を扱う場面では、単なる「秒数」ではなく「Duration」を使う意識を持っておくと、Swiftらしいコードが書けるようになるはずです!
