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

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

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

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

Q&A

解決済

1回答

2093閲覧

NSUserDefaultsを使用してのカスタムクラス保存ができません。

h.kato.1029

総合スコア14

Swift

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

0グッド

1クリップ

投稿2017/07/26 09:05

編集2017/07/27 01:46

###前提・実現したいこと
swiftでカスタムクラス(DataCollection型)を、NSUserDefaultsを使用して保存したいのですが
Buildした時点でエラーが発生してしまいます。
カスタムクラス(DataCollection型)の内容はカスタムクラス(Data型)の配列です。
カスタムクラスが入れ子のようになっているのがいけないのでしょうか。。。

###発生している問題・エラーメッセージ
エラーメッセージ
reason: '-[Change.Data initWithCoder:]: unrecognized selector sent to instance

###該当のソースコード

【DataCollection.swift】 import UIKit class DataCollection: NSObject, NSCoding { static let sharedInstance = DataCollection() var datas: [Data] = [] func addDataCollection(data: Data) { self.datas.insert(data, atIndex: 0) } override init() { } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(datas, forKey: "datas_key") } required init?(coder aDecoder: NSCoder) { self.datas = aDecoder.decodeObjectForKey("datas_key") as! [Data] } }
【Data.swift】 import UIKit class Data: NSObject { var text: String? var currentTime: String? var todoDone: Bool = false }

###試したこと
ViewController.swiftには下記のようなシリアライズ処理を記述しています。

let userDefaults = NSUserDefaults.standardUserDefaults() if let storeData = userDefaults.objectForKey("dataCollection") as? NSData { if let unarchivedData = NSKeyedUnarchiver.unarchiveObjectWithData(storeData) as? DataCollection { self.dataCollection = unarchivedData } } let archiveData = NSKeyedArchiver.archivedDataWithRootObject(self.dataCollection) let userDefaults = NSUserDefaults.standardUserDefaults() userDefaults.setObject(archiveData, forKey: "dataCollection") userDefaults.synchronize()

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode version 7.2.1

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

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

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

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

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

fuzzball

2017/07/27 01:17

エラーが出るのは、Buildした時点ではなく実行したときでしょうか?
guest

回答1

0

ベストアンサー

DataクラスにもNSCodingを実装しないといけないのでは?

投稿2017/07/27 01:27

fuzzball

総合スコア16731

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

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

h.kato.1029

2017/07/27 01:40

ご回答頂きましてどうもありがとうございます! 下記のようにDataクラスにもNSCodingを実装すると 保存処理ができました。 大変助かりました! class Data: NSObject, NSCoding { var text: String? var currentTime: String? var todoDone: Bool = false override init() { } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(text, forKey: "text") aCoder.encodeObject(currentTime, forKey: "currentTime") aCoder.encodeBool(todoDone, forKey: "todoDone") } required init?(coder aDecoder: NSCoder) { self.text = aDecoder.decodeObjectForKey("text") as? String self.currentTime = aDecoder.decodeObjectForKey("currentTime") as? String self.todoDone = aDecoder.decodeBoolForKey("todoDone") } }
fuzzball

2017/07/27 01:44

質問とは関係ありませんが、Swift3でNSDataがDataに名前変更されていますので、Dataという名前は使わない方が良いかと。質問用の仮の名前かも知れませんが念のため。
h.kato.1029

2017/07/27 01:52

実はSwift3で同じ処理をしようとした時に、アドバイス頂いた点でエラーが発生していました。クラス名をMyDataに変更してなんとか自力で解決出来ていました。大変参考になるアドバイスも頂きどうもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問