バージョンが異なるかもしれませんが、iOS15からFormatStyle
というのが登場しました。これでFormatter
を作成せずに色々なデータを直接 Text
で表示することが可能になりました。
そのため、iOS15以降の場合は以下のように記述すると表示されると思います。
swift
1import SwiftUI
2
3struct ContentView: View {
4 let date: Date = Date()
5 var body: some View {
6 Text(date, format: Date.FormatStyle.dateTime)
7 }
8}
また、以下のような実装方法もあります。解説については「リアルタイム日時を表示する方法」を参考にしてください。
swift
1@State var dateText = ""
2@State var nowDate = Date()
3private let dateFormatter = DateFormatter()
4init() {
5 dateFormatter.dateFormat = "YYYY/MM/dd(E) \nHH:mm:ss"
6 dateFormatter.locale = Locale(identifier: "ja_jp")
7}
8var body: some View {
9 Text(dateText.isEmpty ? "\(dateFormatter.string(from: nowDate))" : dateText)
10 .onAppear {
11 Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
12 self.nowDate = Date()
13 dateText = "\(dateFormatter.string(from: nowDate))"
14 }
15 }
16}
エラーコードの解説
エラーコード
Cannot use instance member 'dateFormatter' within property initializer; property initializers run before 'self' is available
は日本語では以下のように訳すことができます。
プロパティ初期化の中でインスタンスメンバー 'dateFormatter' を使うことはできません。プロパティ初期化は 'self' が利用可能になる前に実行されます
このエラーはSwiftUIに限らず、Swift全般で発生するエラーです。
Swiftでは、クラスや構造体が作成されるときに、その中のプロパティ(let
やvar
だと思って構いません)が初めて値を持つことを「初期化」と言いいます。
この初期化をするタイミングがとても重要です。
エラーメッセージに登場したself
とは、クラスや構造体自身を指す単語です。Swiftの言語仕様では、self
は「初期化してから使うもの」という決まりがあります。
今回、dateFormatter
というインスタンスメンバーを初期化する前に使用したため、このようなエラーが発生しました。