Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Timer
Swiftの『Timer』クラスを使うと、一定時間後や一定間隔でコードを実行できます。UIの定期更新やアニメーションのトリガーによく使われます。
メソッド一覧
| メソッド / プロパティ | 概要 |
|---|---|
| Timer.scheduledTimer(withTimeInterval:repeats:block:) | タイマーを作成してデフォルトの RunLoop に追加します。 |
| Timer.scheduledTimer(timeInterval:target:selector:userInfo:repeats:) | セレクタ(Objective-C スタイル)でタイマーを作成します。 |
| Timer.invalidate() | タイマーを停止します。再起動はできません。 |
| timer.isValid | タイマーが有効かどうかを返します。 |
| timer.fire() | タイマーを即座に発火させます。 |
| Task.sleep(nanoseconds:) | Swift Concurrency での遅延実行に使います(推奨)。 |
サンプルコード
import Foundation
// 1秒ごとに繰り返すタイマー
var count = 0
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
count += 1
print("経過: \(count)秒")
if count >= 3 {
timer.invalidate() // タイマーを停止
print("タイマー停止")
}
}
// RunLoop を回して実際にタイマーを動かす(コマンドラインアプリの場合)
RunLoop.current.run(until: Date(timeIntervalSinceNow: 3.5))
// 1回だけ実行するタイマー
let oneShot = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { _ in
print("2秒後に1回だけ実行")
}
RunLoop.current.run(until: Date(timeIntervalSinceNow: 2.5))
// Swift Concurrency での遅延実行(推奨)
Task {
print("タスク開始")
try await Task.sleep(nanoseconds: 1_000_000_000) // 1秒待機
print("1秒後の処理")
try await Task.sleep(nanoseconds: 500_000_000) // 0.5秒待機
print("さらに0.5秒後の処理")
}
RunLoop.current.run(until: Date(timeIntervalSinceNow: 2.0))
概要
『Timer』は RunLoop に結び付いて動作します。『scheduledTimer』はデフォルトの RunLoop に自動追加されます。バックグラウンドスレッドで使う場合は手動で RunLoop に追加する必要があります。
Swift Concurrency が使える環境では、Timer の代わりに『Task.sleep(nanoseconds:)』や『Task.sleep(for:)』を使う方がシンプルです。Timer を停止し忘れると RunLoop が Timer への参照を保持し続けてメモリリークが発生します。不要になったら必ず invalidate() を呼んでください。
NotificationCenter についてはNotificationCenterを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。