前提
カレンダーで選択した日付をday(Date型)として読み取り、その日付と今日の日付との差を自動的に計算し表示するシステムを作っております。
表示することはできたのですが、その情報を保存する機能の実装中にエラーが発生してしまいました。
保存可能にする機能は、この教材をもとに進めています。
https://developer.apple.com/tutorials/app-dev-training/persisting-data
カレンダーにはFSCalendarというライブラリを用いています。
実現したいこと
- 一度アプリをシャットダウンしても選択した日付、dayが保存されているようにしたい
発生している問題・エラーメッセージ
以下のApp.swift
内にExtra trailing closure passed in call
というエラーが発生しました。
私自身Closureの原理が分かっておらず、何が問題なのかはっきりしておりません。
これはどのように訂正すればよいですか?
該当のソースコード
CalendarTestViewではFSCalendarを表示するための土台を作っています。
CalendarAppealViewでは、カレンダーを表示し
CalendarViewController.swift
1import SwiftUI 2import FSCalendar 3import UIKit 4 5struct CalendarTestView: UIViewRepresentable { 6 @Binding var selectedDate: Date 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 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { 34 // ***** 選択した日付をバインディングのselectedDateへ設定します 35 parent.selectedDate = date 36 } 37 38 } 39} 40 41struct CalendarApealView: View{ 42 @Environment(\.scenePhase) private var scenePhase 43// let saveAction: ()->Void 44 @State private var date: Date = Date() 45 @Binding var day: Date 46 var differString: String { 47 let value = UserDefaults.standard.string(forKey: "String") 48 print(value!) 49 let calendar = Calendar.current 50 //today1は今日の日付 51 let today1 = Date() 52 let today2 = calendar.dateComponents([.year, .month, .day], from: today1) 53 let today3 = calendar.date(from: DateComponents(year: today2.year, month: today2.month, day: today2.day))! 54 let date2 = calendar.dateComponents([.year, .month, .day], from: date) 55 let date3 = calendar.date(from: DateComponents(year: date2.year, month: date2.month, day: date2.day))! 56 let result = calendar.dateComponents([.day], from: date3, to: today3) 57 return "\(result.day!)" 58 } 59 func set(_: Any?, forKey:String){ 60 61 } 62 var body: some View { 63 HStack{ 64 VStack{ 65 CalendarTestView(selectedDate: $date) 66 .frame(height: 400) 67 HStack(){ 68 Text(differString) 69 .font(.title) 70 .padding() 71 .foregroundColor(Color(red: 0.324, green: 0.758, blue: 0.49)) 72 Text("Days") 73 .font(.title2) 74 } 75 Button(action: { 76 UserDefaults.standard.set(self.differString, forKey: "String") 77 func StringToDate(dateValue: String, format: String) -> Date { 78 let dateFormatter = DateFormatter() 79 dateFormatter.calendar = Calendar(identifier: .gregorian) 80 dateFormatter.dateFormat = format 81 return dateFormatter.date(from: dateValue) ?? Date() 82 } 83 date = StringToDate(dateValue: differString, format: "yyyy/MM/dd") 84// self.presentationMode.wrappedValue.dismiss() 85 }) { 86 Text("confirm") 87 .font(.title2) 88 .padding(16) 89 .background(Color(red: 0.324, green: 0.758, blue: 0.49)) 90 .foregroundColor(Color.white) 91 .cornerRadius(10) 92 } 93 } 94 }.navigationTitle("Day Setting") 95 .onChange(of: scenePhase) { phase in 96 if phase == .inactive { } 97 //{saveAction()} 98 } 99 } 100 101}
App.swift
1import SwiftUI 2 3@main 4struct App: App { 5 @StateObject private var store = ScrumStore() 6 var body: some Scene { 7 WindowGroup { 8 ContentView() 9 NavigationView { 10 CalendarApealView(day: $store.scrums) { //ここでエラーExtra trailing closure passed in call 11 ScrumStore.save(dates: store.scrums) { result in 12 if case .failure(let error) = result { 13 fatalError(error.localizedDescription) 14 } 15 } 16 } 17 } 18 .onAppear { 19 ScrumStore.load { result in 20 switch result { 21 case .failure(let error): 22 fatalError(error.localizedDescription) 23 case .success(let dates): 24 store.scrums = scrums 25 } 26 } 27 } 28 } 29 } 30} 31
ScrumStore.swift
1import Foundation 2import SwiftUI 3 4class ScrumStore: ObservableObject { 5 @Published var scrums: Date = Date() 6 7 private static func fileURL() throws -> URL { 8 try FileManager.default.url(for: .documentDirectory, 9 in: .userDomainMask, 10 appropriateFor: nil, 11 create: false) 12 .appendingPathComponent("dates.data") 13 } 14 15 static func load(completion: @escaping (Result<Date, Error>)->Void) { 16 DispatchQueue.global(qos: .background).async { 17 do { 18 let fileURL = try fileURL() 19 guard let file = try? FileHandle(forReadingFrom: fileURL) else { 20 DispatchQueue.main.async { 21 completion(.success(Date())) 22 } 23 return 24 } 25 let dailyScrums = try JSONDecoder().decode(Date.self, from: file.availableData) 26 DispatchQueue.main.async { 27 completion(.success(dailyScrums)) 28 } 29 } catch { 30 DispatchQueue.main.async { 31 completion(.failure(error)) 32 } 33 } 34 } 35 } 36 static func save(dates: Date, completion: @escaping (Result<Date, Error>)->Void) { 37 DispatchQueue.global(qos: .background).async { 38 do { 39 let data = try JSONEncoder().encode(dates) 40 let outfile = try fileURL() 41 try data.write(to: outfile) 42 DispatchQueue.main.async { 43 completion(.success(dates)) 44 } 45 } catch { 46 DispatchQueue.main.async { 47 completion(.failure(error)) 48 } 49 } 50 } 51 } 52 53} 54
補足情報(FW/ツールのバージョンなど)
macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1
回答1件
あなたの回答
tips
プレビュー