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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

1回答

1078閲覧

【SwiftUI】Userdefaultsのエラー

nnn09

総合スコア2

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2020/10/11 08:13

前提・実現したいこと

ListのデータをUserdefaultsで保存しようと考えています。
以下のエラーを直す方法を教えていただきたいです。

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

出ているエラーそのまま

"Attempt to insert non-property list object (\n\"pra3.Operate(id: 4C6DA55C-D1F2-4BE3-BE70-D88FB31243FA, task: \\"task\\", time: \\"60\\")\",\n \"pra3.Operate(id: 3C743C08-2EE5-4272-8A39-C42727FEA9A6, task: \\"1\\", time: \\"1\\")\"\n) for key operate2"

要約

Attempt to insert non-property list object (~~~) for key operate2"

該当のソースコード

SwiftUI

1 2import SwiftUI 3 4struct Operate: Identifiable{ 5 6 var id = UUID() 7 var task: String 8 var time: String 9 10 11} 12 13var ListWidth = UIScreen.main.bounds.width 14var ListHeight = UIScreen.main.bounds.height 15 16struct OperateList: View { 17 18 @State var pretask: String = "" 19 @State var pretime: String = "" 20 @State var operate: [Operate] = [Operate(task: "task", time: "60")] 21 22 var body: some View { 23 24 VStack{ 25 26 HStack{ 27 28 29 TextField("task", text: self.$pretask).textFieldStyle(RoundedBorderTextFieldStyle()).frame(width: ListWidth / 2, height: ListHeight / 20) 30 //taskの入力 31 32 TextField("time", text: self.$pretime).textFieldStyle(RoundedBorderTextFieldStyle()).frame(width: ListWidth / 5, height: ListHeight / 20).keyboardType(.numberPad) 33 //timeの入力 34 35 Button(action: { 36 self.operate.append(Operate(task: self.pretask, time: self.pretime)) 37 self.pretask = "" 38 self.pretime = "" 39 UserDefaults.standard.set(self.operate, forKey: "operate2") 40 }){ 41 42 ZStack{ 43 RoundedRectangle(cornerRadius: 5).frame(width: ListWidth / 7, height: ListHeight / 20).foregroundColor(.green) 44 Text("追加").foregroundColor(.white) 45 } 46 47 } 48 //taskとtimeの追加 49 50 } 51 52 53 54 55 NavigationView { 56 List{ 57 58 ForEach(operate, id: .id){num in 59 60 HStack{ 61 Text(num.task) 62 Spacer() 63 Text("(num.time)min") 64 } 65 66 67 68 } 69 .onDelete(perform: delete) 70 .onMove(perform: move) 71 72 73 } 74 .navigationBarItems(trailing: EditButton()) 75 .navigationBarTitle(Text("Operate"), displayMode: .large) 76 77 } 78 79 80 }.onAppear(){ 81 guard let defaultItem = UserDefaults.standard.array(forKey: "operate2") as? [Operate] else{return} 82 self.operate = defaultItem 83 } 84 85 86 87 88 89 } 90 91 92 93 func delete(at offsets: IndexSet){ 94 operate.remove(atOffsets: offsets) 95 } 96 97 func move(from source: IndexSet, to destination: Int){ 98 operate.move(fromOffsets: source, toOffset: destination) 99 } 100 101 102} 103 104 105 106struct ToDoList_Previews: PreviewProvider { 107 static var previews: some View { 108 OperateList() 109 } 110 111} 112 113 114 115

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Userdefaultsに保存するデータ型には制限があります。
struct Operateはその制限を外れているのでそのままでは保存できません。

↓保存方法はこちらをご覧ください。
https://qiita.com/masakihori/items/7a0ed9d109800d714c0b

投稿2020/10/12 01:24

MasakiHori

総合スコア3384

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問