実現したいこと
ビューに配置した「Add」ボタンを押した際に1対多の親子構造のデータをSwiftDataにINSERTしたいと思います。
親データは日付と気温を入力し、子データの入力項目は、入力定義データを読み込んでビュー表示時に入力欄を生成します。
ソース上では配列「arr」にしています。
発生している問題・分からないこと
Parentに子データの配列「children」を渡そうとするとParentにセットできないでエラーになります。
そもそものアプローチの仕方が間違っているのでしょうか?
該当のソースコード
swift
1//親子のデータ構造モデル 2import Foundation 3import SwiftData 4 5@Model 6final class Parent { 7 @Attribute(.unique) var pid: UUID 8 var hiduke: Date 9 var kion: String 10 var create_date: Date 11 var children: [Child] = [] 12 @Relationship(deleteRule: .cascade, inverse: \Child.parent) 13 init(hiduke: Date, kion: String, children: [Child]) { 14 self.pid = UUID() 15 self.hiduke = hiduke 16 self.kion = kion 17 self.create_date = Date() 18 self.children = children 19 } 20} 21 22 23@Model 24final class Child { 25 var dataid: Int 26 var name: String = "" 27 var create_date: Date 28 var parent: Parent? 29 30 init(dataid: Int, name: String, parent: Parent){ 31 self.dataid = dataid 32 self.name = name 33 self.parent = parent 34 self.create_date = Date() 35 } 36 37}
swift
1//ビュー 2import SwiftUI 3import SwiftData 4 5struct EntryView: View { 6 @Environment(\.modelContext) private var modelContext 7 @State private var txtKion: String = "" 8 @State private var txtHiduke: Date = Date() 9 10 @State var children:[Child] = [] //←Parentに紐付く子データ 11 var oya:Parent = Parent(hiduke: Date(), kion: "", children: []) 12 13 private func appendChild(ko: Child) -> Bool { 14 children.append(ko) 15 return true 16 } 17 18 let arr = ["入力項目1", "入力項目2", "入力項目3"] 19 20 var body: some View { 21 VStack{ 22 DatePicker(selection: $txtHiduke, displayedComponents:[.date], label: { Text("日付") }) 23 .padding(.all) 24 .environment(\.locale, Locale(identifier: "ja_JP")) 25 26 TextField("気温", text: $txtKion) 27 28 ForEach(arr, id:\.self) { item in 29 HStack{ 30 var ko = Child(dataid: 1, name: "", parent: oya) 31 32 Text(item) 33 ChildView(entity: ko) 34 .onAppear(){ 35 let x = appendChild(ko: ko) 36 } 37 } 38 } 39 40 41 Button("Add") { 42 let newItem = Parent(hiduke: txtHiduke, kion: txtKion, children: children) //←エラー発生個所 43 modelContext.insert(newItem) 44 } 45 } 46 } 47}
swift
1//子データの入力欄用ビュー 2import SwiftUI 3struct ChildView: View { 4 5 let entity: Child 6 7 @State private var questionVariable = "" 8 9 var body: some View { 10 11 TextField(entity.name, text: $questionVariable) 12 .onChange(of: questionVariable) { 13 entity.name = questionVariable 14 15 16 } 17 } 18}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
親子構造のデータを扱えることは分かりましたが、具体的な例が見当たりませんでした。
補足
特になし

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。