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

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

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

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

解決済

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

KaoruYoshida
runrun

総合スコア30

Swift

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

1回答

0リアクション

0クリップ

172閲覧

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

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 // @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> @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{ Text("When did you start this food style?") .font(.title2) 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

@main struct App: App { @StateObject private var store = ScrumStore() var body: some Scene { WindowGroup { ContentView() NavigationView { CalendarApealView(day: $store.scrums) {   //ここにエラー 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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Swift

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