TimelineEntryプロトコルは、SwiftUIのウィジェット開発で使用されるプロトコルです。
このプロトコルに準拠した構造体は、ウィジェットが表示するデータの単位(エントリ)を表します。TimelineEntryには、ウィジェットが表示される日時を表すdateプロパティが含まれており、これを基にウィジェットの内容が更新されます。

構造
struct MyWidgetEntry: TimelineEntry {
let date: Date
let value: String
}上記の例では、MyWidgetEntryがTimelineEntryに準拠し、dateとvalueの2つのプロパティを持っています。
ここで、dateはウィジェットの更新タイミングを指定し、valueは表示されるデータです。
このように、必要に応じて他のプロパティを追加することで、ウィジェットが表示する情報を柔軟に拡張できます。
TimelineEntryの使い方
TimelineEntryを使用する際、TimelineProviderと共に使われることが多いです。TimelineProviderは複数のTimelineEntryを生成し、それをタイムラインとしてウィジェットに渡します。
このタイムラインによってウィジェットがどのタイミングで更新されるかが決まります。
TimelineEntryの使い方をもう少し詳しく解説します。
TimelineProviderとの連携
TimelineEntryは通常、TimelineProviderと一緒に使われます。TimelineProviderはウィジェットのデータを生成し、それをタイムラインとして提供します。
struct MyTimelineProvider: TimelineProvider {
func placeholder(in context: Context) -> MyWidgetEntry {
MyWidgetEntry(date: Date(), value: "Loading...")
}
func getSnapshot(in context: Context, completion: @escaping (MyWidgetEntry) -> ()) {
let entry = MyWidgetEntry(date: Date(), value: "Snapshot Value")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<MyWidgetEntry>) -> ()) {
var entries: [MyWidgetEntry] = []
let currentDate = Date()
for hourOffset in 0..<5 {
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
let entry = MyWidgetEntry(date: entryDate, value: "Value \(hourOffset)")
entries.append(entry)
}
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
}getTimelineメソッド
getTimelineメソッドは、複数のTimelineEntryを生成し、ウィジェットが定期的に更新されるようにします。
上記の例では、現在の時間から1時間ごとに5回のエントリを作成しています。
タイムラインの表示
生成されたTimelineEntryは、ウィジェットのbodyで使用され、更新タイミングに応じて表示内容が変わります。
struct MyWidgetEntryView: View {
var entry: MyTimelineProvider.Entry
var body: some View {
Text(entry.value)
}
}タイムラインのポリシー
Timelineにはpolicyがあります。policyは、ウィジェットが更新をリクエストするタイミングを制御します。
例えば、.atEndはタイムラインが終了したときに次の更新をリクエストします。
まとめ
TimelineEntryを使うことで、定期的に更新される動的なウィジェットを実装できます。

