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

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

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

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

Q&A

解決済

1回答

4130閲覧

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

KaoruYoshida

総合スコア36

Swift

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

0グッド

0クリップ

投稿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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/07/26 05:16

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

2022/07/26 07:32

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

回答1

0

ベストアンサー

以下のApp.swift内にExtra trailing closure passed in call
というエラーが発生しました。
私自身Closureの原理が分かっておらず、何が問題なのかはっきりしておりません。
これはどのように訂正すればよいですか?

エラーメッセージは、「(後置クロージャを受け取るように作られていないのに、)追加の後置クロージャが呼び出し時に渡されている」と言っています。

そのエラーが発生している理由は、CalendarApealViewを宣言する側の未初期化項目とCalendarApealViewを呼び出す側の初期化引数が一致していないためです。

具体的には、 CalendarApealView

swift

1// let saveAction: ()->Void

がコメントになっていて、クロージャを初期化引数で受け取るように作られていないためです。
なお、後置クロージャを受け取れるようにするには、初期化引数の最後にクロージャを指定できるようにする必要がありますから、

swift

1@Binding var day: Date 2let saveAction: ()->Void

のように、dayの宣言の後にsaveActionを宣言する必要があります。

あとは、 saveAction() を呼び出す箇所の処理もコメントを外して正しくクロージャを呼び出せるようにする必要があると思います。

投稿2022/07/26 13:33

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KaoruYoshida

2022/07/27 03:33

ご回答ありがとうございます!進めることができました。 質問なのですが、App.swiftでCalendarApealViewを呼び出す時、 saveActionを呼び出す処理の記載はどのようにしたら良いですか?
KaoruYoshida

2022/07/27 08:36

上記の件、解決しました!大変感謝してます。 また質問することがあると思いますが、ぜひよろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問