前提
Calendarを表示し、選択日と今日の日付の差を取り出すシステムを作っております。
取り出す値はdate型で、それをString型、そしてInt型に変換した後、引き算をしています。
その後、Textとして表示させるためにString型に変換しています。
Calendarには、FSCalendarというライブラリを用いています。
実現したいこと
- 選択日をInt型で取り出せるようにしたい
- 選択日の変数がnilにならないようにしたい
発生している問題・エラーメッセージ
選択日をdate型で取り出し、String型に変換した後、Int型に変換する際のコードで以下のようなnilエラーになってしまう。
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
おそらく、ページを読み込んだ時点ではまだ選択されていないため、選択日が存在せずnilだと認識されてしまうから起こるエラーだと思っています。
そこで疑問なのが、
func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { //date -> string let selecteddate = dateFormatter.string(from: date) selectedDate = selecteddate } let selectedInt:Int = Int(selectedDate)!//ここでエラー let differ = selectedInt-todayInt let differString:String = String(differ)
の居場所が分からない。
struct CalendarTestViewの中なのか??
SwiftUI初心者なので、理由含め教えてくだされば幸いです。
全体のコードはこちらです↓
該当のソースコード
変数は、
今日の
date型:dt
String型:todayString
Int型:todayInt
選択日の
date型:date
String型:selectedString
Int型:selectedInt
(選択日)ー(今日)はInt型のdifferという変数で表しています。
SwiftUI
import SwiftUI import FSCalendar import UIKit struct CalendarTestView: UIViewRepresentable { func makeUIView(context: Context) -> UIView { typealias UIViewType = FSCalendar let fsCalendar = FSCalendar() fsCalendar.delegate = context.coordinator fsCalendar.dataSource = context.coordinator return fsCalendar } func updateUIView(_ uiView: UIView, context: Context) { } func makeCoordinator() -> Coordinator{ return Coordinator(self) } class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource { var parent:CalendarTestView init(_ parent:CalendarTestView){ self.parent = parent } } } //残り日数の処理 var dateFormatter: DateFormatter { let dateFormatter = DateFormatter() dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "D", options: 0, locale: Locale(identifier: "en_US")) return dateFormatter } let dt = Date() let todayString = dateFormatter.string(from: dt) let todayInt:Int = Int(todayString)! var selectedDate: String = "date" func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { //date -> string let selecteddate = dateFormatter.string(from: date) print(selecteddate) selectedDate = selecteddate } let selectedInt:Int = Int(selectedDate)!//ここでnilエラーが出てしまう let differ = selectedInt-todayInt let differString:String = String(differ) struct CalendarApealView: View { @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> var body: some View { VStack(){ Text("When did you start this food style?") .font(.title2) CalendarTestView() Text(differString) .font(.title) .padding() Button(action: { self.presentationMode.wrappedValue.dismiss() }) { Text("confirm") .font(.title2) .padding(15) .background(Color.green) .foregroundColor(Color.white) .cornerRadius(10) } } } } struct CalendarTestView_Previews: PreviewProvider { static var previews: some View { CalendarApealView() } }
補足情報(FW/ツールのバージョンなど)
macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1
まだ回答がついていません
会員登録して回答してみよう