質問するログイン新規登録

回答編集履歴

4

修正

2018/05/07 21:21

投稿

_Kentarou
_Kentarou

スコア8490

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

修正

2018/05/07 21:21

投稿

_Kentarou
_Kentarou

スコア8490

answer CHANGED
@@ -1,5 +1,7 @@
1
- `UserDefaults`にはカスタムクラスはそのままでは保存できません、保存するのでしたら`NSCoding`プロトコルに準拠させないといけないす。
1
+ > ViewController.testArrayがClass型だから保存できないしょうか?
2
2
 
3
+ その通りです、`UserDefaults`にはカスタムクラスはそのままでは保存できません、保存するのでしたら`NSCoding`プロトコルに準拠させないといけません。
4
+
3
5
  先日も同じような質問(カスタムクラスの配列を保存する)に答えていますので、以下を参考にしてみてください。
4
6
 
5
7
  参考質問: [ランキング表示がうまくいきません。Swift,配列,Double型](https://teratail.com/questions/123824)

2

修正

2018/05/06 21:20

投稿

_Kentarou
_Kentarou

スコア8490

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

修正

2018/05/06 21:13

投稿

_Kentarou
_Kentarou

スコア8490

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)