回答編集履歴

4

修正

2018/05/07 21:21

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -13,3 +13,119 @@
13
13
  参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)
14
14
 
15
15
  参考サイト(古いですが): [NSUserDefaultsに自作クラスを保持(swift)](http://blog.kaerusystem.jp/article/434175557.html)
16
+
17
+
18
+
19
+ 回答追記
20
+
21
+ ---
22
+
23
+
24
+
25
+ 取得するところのコードが間違えていたので修正、あとクラス方の初期化のところも`decodeInteger`を使うように修正しました。
26
+
27
+ 違いを比べて自分のプロジェクトに当てはめてみてください。
28
+
29
+
30
+
31
+ ```swift
32
+
33
+ import UIKit
34
+
35
+
36
+
37
+ class ViewController: UIViewController {
38
+
39
+
40
+
41
+ override func viewDidLoad() {
42
+
43
+ super.viewDidLoad()
44
+
45
+
46
+
47
+ let classData1 = Class(className: "a", roomName: "b", cellNumber: 1)
48
+
49
+ let classData2 = Class(className: "c", roomName: "d", cellNumber: 2)
50
+
51
+ let classData3 = Class(className: "e", roomName: "f", cellNumber: 3)
52
+
53
+ let classArray = [classData1, classData2, classData3]
54
+
55
+
56
+
57
+ // 保存
58
+
59
+ UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: classArray), forKey: "TimeTable")
60
+
61
+ UserDefaults.standard.synchronize()
62
+
63
+
64
+
65
+ // 取得
66
+
67
+ if let data = UserDefaults.standard.object(forKey: "TimeTable") as? Data,
68
+
69
+ let classArray = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Class] {
70
+
71
+ print(classArray)
72
+
73
+ }
74
+
75
+ }
76
+
77
+ }
78
+
79
+
80
+
81
+ class Class: NSObject, NSCoding {
82
+
83
+
84
+
85
+ let className: String
86
+
87
+ let roomName: String
88
+
89
+ let cellNumber: Int
90
+
91
+
92
+
93
+ init(className: String, roomName: String, cellNumber: Int) {
94
+
95
+
96
+
97
+ self.className = className
98
+
99
+ self.roomName = roomName
100
+
101
+ self.cellNumber = cellNumber
102
+
103
+ }
104
+
105
+
106
+
107
+ func encode(with aCoder: NSCoder) {
108
+
109
+ aCoder.encode(self.className, forKey: "name")
110
+
111
+ aCoder.encode(self.roomName, forKey: "room")
112
+
113
+ aCoder.encode(self.cellNumber, forKey: "number")
114
+
115
+ }
116
+
117
+
118
+
119
+ required init?(coder aDecoder: NSCoder) {
120
+
121
+ self.className = aDecoder.decodeObject(forKey: "name") as! String
122
+
123
+ self.roomName = aDecoder.decodeObject(forKey: "room") as! String
124
+
125
+ self.cellNumber = aDecoder.decodeInteger(forKey: "number")
126
+
127
+ }
128
+
129
+ }
130
+
131
+ ```

3

修正

2018/05/07 21:21

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -1,4 +1,8 @@
1
+ > ViewController.testArrayがClass型だから保存できないのでしょうか?
2
+
3
+
4
+
1
- `UserDefaults`にはカスタムクラスはそのままでは保存できません、保存するのでしたら`NSCoding`プロトコルに準拠させないといけないです
5
+ その通りです、`UserDefaults`にはカスタムクラスはそのままでは保存できません、保存するのでしたら`NSCoding`プロトコルに準拠させないといけません
2
6
 
3
7
 
4
8
 

2

修正

2018/05/06 21:20

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -7,3 +7,5 @@
7
7
 
8
8
 
9
9
  参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)
10
+
11
+ 参考サイト(古いですが): [NSUserDefaultsに自作クラスを保持(swift)](http://blog.kaerusystem.jp/article/434175557.html)

1

修正

2018/05/06 21:13

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -6,4 +6,4 @@
6
6
 
7
7
 
8
8
 
9
- 参考質問: https://teratail.com/questions/123824
9
+ 参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)