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

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

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

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

Q&A

解決済

2回答

388閲覧

swiftでUserDefaults.standardに自分で作った構造体の配列を入れることはできないのでしょうか?

Hayato1201

総合スコア220

Swift

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

0グッド

1クリップ

投稿2018/09/05 14:25

以下の様に構造体の配列をUserDefaults.standardに保存したいと思ったのですが、実行した時に[User Defaults] Attempt to set a non-property-listの様なエラーが出ました。コードは以下になります。

Swift

1struct Preference { 2 static let userDefault = UserDefaults.standard 3 4 struct Key { 5 static let All_data = "all_data" 6 } 7} 8 9extension Preference { 10 11 static var all_data:[time_log]? { 12 get{ 13 return userDefault.object(forKey: Key.All_data) as? [time_log] 14 15 } 16 set { 17 userDefault.set(newValue, forKey: Key.All_data) 18 userDefault.synchronize() 19 } 20 21 } 22 23} 24 25struct time_log { 26 27 var start_time:Date! 28 var name:String! 29 var dur:Double! 30 31 32} 33

この様に宣言しておき、以下の様に使おうとしました。

Swift

1var logs = [time_log]() 2 3 4logs.append(time_log(start_time: hope, name: huga, dur: piyo)) 5Preference.all_data = logs //これでエラー

そもそもこの様な形で自分の作った構造体をUserDefaultsに保存することはできないのでしょうか?

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

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

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

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

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

guest

回答2

0

今でしたらCodableを使用すると UserDefaults への保存は楽にできますね。

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 let data1 = time_log(start_time: Date(), name: "name1", dur: 0.1) 10 let data2 = time_log(start_time: Date(), name: "name2", dur: 0.2) 11 let data3 = time_log(start_time: Date(), name: "name3", dur: 0.3) 12 13 let dataArray = [data1, data2, data3] 14 Preference.all_data = dataArray 15 16 17 let saveData = Preference.all_data 18 print(saveData?.first?.name ?? "") 19 //=> name1 20 print(saveData?.first?.dur ?? "") 21 //=> 0.1 22 23 print(saveData?.last?.name ?? "") 24 //=> name3 25 print(saveData?.last?.dur ?? "") 26 //=> 0.3 27 } 28} 29 30 31 32struct Preference { 33 static let userDefault = UserDefaults.standard 34 35 struct Key { 36 static let All_data = "all_data" 37 } 38} 39 40extension Preference { 41 42 static var all_data:[time_log]? { 43 get{ 44 guard let data = userDefault.object(forKey: Key.All_data) as? Data else { return nil } 45 let timeLogs = try? JSONDecoder().decode([time_log].self, from: data) 46 return timeLogs 47 } 48 set { 49 let data = try? JSONEncoder().encode(newValue) 50 userDefault.set(data, forKey: Key.All_data) 51 } 52 } 53} 54 55struct time_log: Codable { 56 var start_time:Date 57 var name:String 58 var dur:Double 59} 60

投稿2018/09/08 05:59

_Kentarou

総合スコア8490

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

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

0

ベストアンサー

マニュアルを見るとわかると思いますが、
setできるのは、基本型とURL以外には、Anyですが、
Any も型が決まっています。
ですので、JSONなどに変換した後でStringとして入れるか、NSDataに変換するか
structを出し入れするラッパを被せてメンバ変数を個別に入れるか
かと。

投稿2018/09/05 15:46

t_obara

総合スコア5488

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

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

Hayato1201

2018/09/05 16:15

回答ありがとうございます! JsonやNSDataへの変換などの例などはありますでしょうか?今まで行なった事がないので、以上の様な構造体の変換の方法を示して頂けるとなおありがたいです。。。!
hohokihai

2018/09/06 02:55

NSKeyedArchiver/NSKeyedUnarchiverを使えばいけると思います。
Hayato1201

2018/09/08 04:48

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問