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

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

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

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

Q&A

解決済

1回答

1635閲覧

Incorrect argument label in call (have 'day:_:', expected 'saveAction:day:')

KaoruYoshida

総合スコア36

Swift

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

0グッド

0クリップ

投稿2022/07/27 07:16

前提

カレンダーで選択した日付をday(Date型)として読み取り、その日付と今日の日付との差を自動的に計算し表示するシステムを作っております。
表示することはできたのですが、その情報を保存する機能の実装中にエラーが発生してしまいました。
保存可能にする機能は、この教材をもとに進めています。
https://developer.apple.com/tutorials/app-dev-training/persisting-data

カレンダーにはFSCalendarというライブラリを用いています。

実現したいこと

一度アプリをシャットダウンしても選択した日付、dayが保存されているようにしたい

発生している問題・エラーメッセージ

App.swiftにこのようなエラーメッセージが発生しました。

Incorrect argument label in call (have 'day:_:', expected 'saveAction:day:')

これを解決しようとしていたのですが、
App.swiftでCalendarApealView()を呼び出す時、
dayについてCalendarApealView(day: $store.scrums)としたように、
同様にsaveActionを呼び出す処理の記載はどのようにしたら良いか?
が分からず頓挫してしまいました。

お分かりの方ご回答お願いいたします!

該当のソースコード

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 17 18 return fsCalendar 19 } 20 21 func updateUIView(_ uiView: UIView, context: Context) { 22 } 23 24 func makeCoordinator() -> Coordinator{ 25 return Coordinator(self) 26 } 27 28 class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource { 29 var parent:CalendarTestView 30 31 init(_ parent:CalendarTestView){ 32 self.parent = parent 33 } 34 35 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { 36 // ***** 選択した日付をバインディングのselectedDateへ設定します 37 parent.selectedDate = date 38 } 39 40 } 41} 42 43struct CalendarApealView: View{ 44 @Environment(\.scenePhase) private var scenePhase 45 let saveAction: ()->Void 46// @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> 47 @State private var date: Date = Date() 48 @Binding var day: Date 49 var differString: String { 50 let value = UserDefaults.standard.string(forKey: "String") 51 print(value!) 52 let calendar = Calendar.current 53 //today1は今日の日付 54 let today1 = Date() 55 let today2 = calendar.dateComponents([.year, .month, .day], from: today1) 56 let today3 = calendar.date(from: DateComponents(year: today2.year, month: today2.month, day: today2.day))! 57 let date2 = calendar.dateComponents([.year, .month, .day], from: date) 58 let date3 = calendar.date(from: DateComponents(year: date2.year, month: date2.month, day: date2.day))! 59 let result = calendar.dateComponents([.day], from: date3, to: today3) 60 return "\(result.day!)" 61 } 62 func set(_: Any?, forKey:String){ 63 64 } 65 var body: some View { 66 HStack{ 67 VStack{ 68 Text("When did you start this food style?") 69 .font(.title2) 70 CalendarTestView(selectedDate: $date) 71 .frame(height: 400) 72 HStack(){ 73 Text(differString) 74 .font(.title) 75 .padding() 76 .foregroundColor(Color(red: 0.324, green: 0.758, blue: 0.49)) 77 Text("Days") 78 .font(.title2) 79 } 80 Button(action: { 81 UserDefaults.standard.set(self.differString, forKey: "String") 82 func StringToDate(dateValue: String, format: String) -> Date { 83 let dateFormatter = DateFormatter() 84 dateFormatter.calendar = Calendar(identifier: .gregorian) 85 dateFormatter.dateFormat = format 86 return dateFormatter.date(from: dateValue) ?? Date() 87 } 88 date = StringToDate(dateValue: differString, format: "yyyy/MM/dd") 89// self.presentationMode.wrappedValue.dismiss() 90 }) { 91 Text("confirm") 92 .font(.title2) 93 .padding(16) 94 .background(Color(red: 0.324, green: 0.758, blue: 0.49)) 95 .foregroundColor(Color.white) 96 .cornerRadius(10) 97 } 98 } 99 }.navigationTitle("Day Setting") 100 .onChange(of: scenePhase) { phase in 101 if phase == .inactive { } 102 //{saveAction()} 103 } 104 } 105 106}

App.swift

1@main 2struct App: App { 3 @StateObject private var store = ScrumStore() 4 var body: some Scene { 5 WindowGroup { 6 ContentView() 7 NavigationView { 8 CalendarApealView(day: $store.scrums) {   //ここにエラー 9 ScrumStore.save(dates: store.scrums) { result in 10 if case .failure(let error) = result { 11 fatalError(error.localizedDescription) 12 } 13 } 14 } 15 } 16 .onAppear { 17 ScrumStore.load { result in 18 switch result { 19 case .failure(let error): 20 fatalError(error.localizedDescription) 21 case .success(let dates): 22 store.scrums = scrums 23 } 24 } 25 } 26 } 27 } 28} 29

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ページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

一つ前の質問の回答に書いてある通りですが、
デフォルトのイニシャライザはプロパティの順番が考慮されるみたいです。
CalendarApealViewのプロパティについて、
dayの下にsaveActionを定義してあげると良いと思います。

swift

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

https://teratail.com/questions/f8ryst1l68sqlh

イニシャライザについては次のページを翻訳しながら読んでみると良いと思います。

Default Initializers
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID213

Trailing Closuresの記述については次のページを読んでみると良いと思います。

Trailing Closures
(機械翻訳)クロージャ式を関数の最終引数として渡す必要があり、クロージャ式が長い場合、代わりにトレイリングクロージャとして書くと便利なことがあります。この場合、関数呼び出しの括弧の後にトレイリングクロージャを書きますが、トレイリングクロージャはまだ関数の引数です。トレイリングクロージャ構文を使用する場合、最初のクロージャの引数ラベルは関数呼び出しの一部としては書きません。関数呼び出しには複数の末尾のクロージャを含めることができますが、以下の最初のいくつかの例では、1つの末尾のクロージャを使用しています。
https://docs.swift.org/swift-book/LanguageGuide/Closures.html#ID102

投稿2022/07/27 07:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KaoruYoshida

2022/07/27 08:33

ご回答ありがとうございます! 解決しました。またお聞きすることがあると思いますが、ぜひよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問