回答編集履歴
4
修正
answer
CHANGED
@@ -5,4 +5,62 @@
|
|
5
5
|
先日も同じような質問(カスタムクラスの配列を保存する)に答えていますので、以下を参考にしてみてください。
|
6
6
|
|
7
7
|
参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)
|
8
|
-
参考サイト(古いですが): [NSUserDefaultsに自作クラスを保持(swift)](http://blog.kaerusystem.jp/article/434175557.html)
|
8
|
+
参考サイト(古いですが): [NSUserDefaultsに自作クラスを保持(swift)](http://blog.kaerusystem.jp/article/434175557.html)
|
9
|
+
|
10
|
+
回答追記
|
11
|
+
---
|
12
|
+
|
13
|
+
取得するところのコードが間違えていたので修正、あとクラス方の初期化のところも`decodeInteger`を使うように修正しました。
|
14
|
+
違いを比べて自分のプロジェクトに当てはめてみてください。
|
15
|
+
|
16
|
+
```swift
|
17
|
+
import UIKit
|
18
|
+
|
19
|
+
class ViewController: UIViewController {
|
20
|
+
|
21
|
+
override func viewDidLoad() {
|
22
|
+
super.viewDidLoad()
|
23
|
+
|
24
|
+
let classData1 = Class(className: "a", roomName: "b", cellNumber: 1)
|
25
|
+
let classData2 = Class(className: "c", roomName: "d", cellNumber: 2)
|
26
|
+
let classData3 = Class(className: "e", roomName: "f", cellNumber: 3)
|
27
|
+
let classArray = [classData1, classData2, classData3]
|
28
|
+
|
29
|
+
// 保存
|
30
|
+
UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: classArray), forKey: "TimeTable")
|
31
|
+
UserDefaults.standard.synchronize()
|
32
|
+
|
33
|
+
// 取得
|
34
|
+
if let data = UserDefaults.standard.object(forKey: "TimeTable") as? Data,
|
35
|
+
let classArray = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Class] {
|
36
|
+
print(classArray)
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
class Class: NSObject, NSCoding {
|
42
|
+
|
43
|
+
let className: String
|
44
|
+
let roomName: String
|
45
|
+
let cellNumber: Int
|
46
|
+
|
47
|
+
init(className: String, roomName: String, cellNumber: Int) {
|
48
|
+
|
49
|
+
self.className = className
|
50
|
+
self.roomName = roomName
|
51
|
+
self.cellNumber = cellNumber
|
52
|
+
}
|
53
|
+
|
54
|
+
func encode(with aCoder: NSCoder) {
|
55
|
+
aCoder.encode(self.className, forKey: "name")
|
56
|
+
aCoder.encode(self.roomName, forKey: "room")
|
57
|
+
aCoder.encode(self.cellNumber, forKey: "number")
|
58
|
+
}
|
59
|
+
|
60
|
+
required init?(coder aDecoder: NSCoder) {
|
61
|
+
self.className = aDecoder.decodeObject(forKey: "name") as! String
|
62
|
+
self.roomName = aDecoder.decodeObject(forKey: "room") as! String
|
63
|
+
self.cellNumber = aDecoder.decodeInteger(forKey: "number")
|
64
|
+
}
|
65
|
+
}
|
66
|
+
```
|
3
修正
answer
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
1
|
+
> ViewController.testArrayがClass型だから保存できないのでしょうか?
|
2
2
|
|
3
|
+
その通りです、`UserDefaults`にはカスタムクラスはそのままでは保存できません、保存するのでしたら`NSCoding`プロトコルに準拠させないといけません。
|
4
|
+
|
3
5
|
先日も同じような質問(カスタムクラスの配列を保存する)に答えていますので、以下を参考にしてみてください。
|
4
6
|
|
5
7
|
参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)
|
2
修正
answer
CHANGED
@@ -2,4 +2,5 @@
|
|
2
2
|
|
3
3
|
先日も同じような質問(カスタムクラスの配列を保存する)に答えていますので、以下を参考にしてみてください。
|
4
4
|
|
5
|
-
参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)
|
5
|
+
参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)
|
6
|
+
参考サイト(古いですが): [NSUserDefaultsに自作クラスを保持(swift)](http://blog.kaerusystem.jp/article/434175557.html)
|
1
修正
answer
CHANGED
@@ -2,4 +2,4 @@
|
|
2
2
|
|
3
3
|
先日も同じような質問(カスタムクラスの配列を保存する)に答えていますので、以下を参考にしてみてください。
|
4
4
|
|
5
|
-
参考質問: https://teratail.com/questions/123824
|
5
|
+
参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)
|