質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

解決済

【SwiftUI】エラー:Extra trailing closure passed in callの解決法が分かりません…

KaoruYoshida
runrun

総合スコア30

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1回答

0リアクション

0クリップ

371閲覧

投稿2022/07/26 04:40

編集2022/07/26 07:34

前提

カレンダーで選択した日付を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

import SwiftUI import FSCalendar import UIKit struct CalendarTestView: UIViewRepresentable { @Binding var selectedDate: Date 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 } func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { // ***** 選択した日付をバインディングのselectedDateへ設定します parent.selectedDate = date } } } struct CalendarApealView: View{ @Environment(\.scenePhase) private var scenePhase // let saveAction: ()->Void @State private var date: Date = Date() @Binding var day: Date var differString: String { let value = UserDefaults.standard.string(forKey: "String") print(value!) let calendar = Calendar.current //today1は今日の日付 let today1 = Date() let today2 = calendar.dateComponents([.year, .month, .day], from: today1) let today3 = calendar.date(from: DateComponents(year: today2.year, month: today2.month, day: today2.day))! let date2 = calendar.dateComponents([.year, .month, .day], from: date) let date3 = calendar.date(from: DateComponents(year: date2.year, month: date2.month, day: date2.day))! let result = calendar.dateComponents([.day], from: date3, to: today3) return "\(result.day!)" } func set(_: Any?, forKey:String){ } var body: some View { HStack{ VStack{ CalendarTestView(selectedDate: $date) .frame(height: 400) HStack(){ Text(differString) .font(.title) .padding() .foregroundColor(Color(red: 0.324, green: 0.758, blue: 0.49)) Text("Days") .font(.title2) } Button(action: { UserDefaults.standard.set(self.differString, forKey: "String") func StringToDate(dateValue: String, format: String) -> Date { let dateFormatter = DateFormatter() dateFormatter.calendar = Calendar(identifier: .gregorian) dateFormatter.dateFormat = format return dateFormatter.date(from: dateValue) ?? Date() } date = StringToDate(dateValue: differString, format: "yyyy/MM/dd") // self.presentationMode.wrappedValue.dismiss() }) { Text("confirm") .font(.title2) .padding(16) .background(Color(red: 0.324, green: 0.758, blue: 0.49)) .foregroundColor(Color.white) .cornerRadius(10) } } }.navigationTitle("Day Setting") .onChange(of: scenePhase) { phase in if phase == .inactive { } //{saveAction()} } } }

App.swift

import SwiftUI @main struct App: App { @StateObject private var store = ScrumStore() var body: some Scene { WindowGroup { ContentView() NavigationView { CalendarApealView(day: $store.scrums) { //ここでエラーExtra trailing closure passed in call ScrumStore.save(dates: store.scrums) { result in if case .failure(let error) = result { fatalError(error.localizedDescription) } } } } .onAppear { ScrumStore.load { result in switch result { case .failure(let error): fatalError(error.localizedDescription) case .success(let dates): store.scrums = scrums } } } } } }

ScrumStore.swift

import Foundation import SwiftUI class ScrumStore: ObservableObject { @Published var scrums: Date = Date() private static func fileURL() throws -> URL { try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) .appendingPathComponent("dates.data") } static func load(completion: @escaping (Result<Date, Error>)->Void) { DispatchQueue.global(qos: .background).async { do { let fileURL = try fileURL() guard let file = try? FileHandle(forReadingFrom: fileURL) else { DispatchQueue.main.async { completion(.success(Date())) } return } let dailyScrums = try JSONDecoder().decode(Date.self, from: file.availableData) DispatchQueue.main.async { completion(.success(dailyScrums)) } } catch { DispatchQueue.main.async { completion(.failure(error)) } } } } static func save(dates: Date, completion: @escaping (Result<Date, Error>)->Void) { DispatchQueue.global(qos: .background).async { do { let data = try JSONEncoder().encode(dates) let outfile = try fileURL() try data.write(to: outfile) DispatchQueue.main.async { completion(.success(dates)) } } catch { DispatchQueue.main.async { completion(.failure(error)) } } } } }

補足情報(FW/ツールのバージョンなど)

macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

hoshi-takanori

2022/07/26 05:16

CalendarApealView(day: $store.scrums) の後ろの { } で囲まれた部分は、どういう意図で書いたものですか? ScrumStore とは?
KaoruYoshida

2022/07/26 07:32

ScrumStoreは、元にした教材(上のリンク) からそのまま取ってきてしまった名前です。 質問文にScrumStore.swiftのソースコードを追加しましたので、ご覧ください。 情報が足りず申し訳ございません。よろしくお願いします!

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています