前提
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
1import SwiftUI 2import FSCalendar 3import UIKit 4 5struct CalendarTestView: UIViewRepresentable { 6 7 func makeUIView(context: Context) -> UIView { 8 9 typealias UIViewType = FSCalendar 10 11 let fsCalendar = FSCalendar() 12 13 fsCalendar.delegate = context.coordinator 14 fsCalendar.dataSource = context.coordinator 15 16 return fsCalendar 17 } 18 19 func updateUIView(_ uiView: UIView, context: Context) { 20 } 21 22 func makeCoordinator() -> Coordinator{ 23 return Coordinator(self) 24 } 25 26 class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource { 27 var parent:CalendarTestView 28 29 init(_ parent:CalendarTestView){ 30 self.parent = parent 31 } 32 } 33} 34//残り日数の処理 35var dateFormatter: DateFormatter { 36 let dateFormatter = DateFormatter() 37 dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "D", options: 0, locale: Locale(identifier: "en_US")) 38 39 return dateFormatter 40} 41let dt = Date() 42let todayString = dateFormatter.string(from: dt) 43let todayInt:Int = Int(todayString)! 44 45var selectedDate: String = "date" 46func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { 47 //date -> string 48 let selecteddate = dateFormatter.string(from: date) 49 print(selecteddate) 50 51 selectedDate = selecteddate 52} 53let selectedInt:Int = Int(selectedDate)!//ここでnilエラーが出てしまう 54let differ = selectedInt-todayInt 55let differString:String = String(differ) 56 57 58struct CalendarApealView: View { 59 @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> 60 61 var body: some View { 62 VStack(){ 63 Text("When did you start this food style?") 64 .font(.title2) 65 CalendarTestView() 66 Text(differString) 67 .font(.title) 68 .padding() 69 Button(action: { 70 self.presentationMode.wrappedValue.dismiss() 71 }) { 72 Text("confirm") 73 .font(.title2) 74 .padding(15) 75 .background(Color.green) 76 .foregroundColor(Color.white) 77 .cornerRadius(10) 78 } 79 } 80 } 81} 82 83struct CalendarTestView_Previews: PreviewProvider { 84 static var previews: some View { 85 CalendarApealView() 86 } 87}
補足情報(FW/ツールのバージョンなど)
macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/04 10:12