回答編集履歴
4
修正
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
修正
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
修正
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
修正
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)
|