[解決済み] Swift 3 でカスタムオブジェクトを保存しようとすると、非プロパティリストオブジェクトの挿入が試行される
2022-02-26 08:52:59
質問
に準拠したシンプルなオブジェクトがあります。
NSCoding
プロトコルを使用します。
import Foundation
class JobCategory: NSObject, NSCoding {
var id: Int
var name: String
var URLString: String
init(id: Int, name: String, URLString: String) {
self.id = id
self.name = name
self.URLString = URLString
}
// MARK: - NSCoding
required init(coder aDecoder: NSCoder) {
id = aDecoder.decodeObject(forKey: "id") as? Int ?? aDecoder.decodeInteger(forKey: "id")
name = aDecoder.decodeObject(forKey: "name") as! String
URLString = aDecoder.decodeObject(forKey: "URLString") as! String
}
func encode(with aCoder: NSCoder) {
aCoder.encode(id, forKey: "id")
aCoder.encode(name, forKey: "name")
aCoder.encode(URLString, forKey: "URLString")
}
}
のインスタンスを保存しようとしているのです。
UserDefaults
が、以下のエラーで失敗し続けます。
キャッチできない例外 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object for key jobCategory' のため、アプリを終了する。
で保存しているコードです。
UserDefaults
.
enum UserDefaultsKeys: String {
case jobCategory
}
class ViewController: UIViewController {
@IBAction func didTapSaveButton(_ sender: UIButton) {
let category = JobCategory(id: 1, name: "Test Category", URLString: "http://www.example-job.com")
let userDefaults = UserDefaults.standard
userDefaults.set(category, forKey: UserDefaultsKeys.jobCategory.rawValue)
userDefaults.synchronize()
}
}
enumの値からkeyを通常の文字列に置き換えてみましたが、やはり同じエラーが発生します。何が原因なのか、何か心当たりはありませんか?
解決方法を教えてください。
を作成する必要があります。
Data
インスタンスから
JobCategory
インスタンスで
archivedData(withRootObject:)
を保存し、その
Data
のインスタンスは
UserDefaults
でアーカイブし、後で
unarchiveTopLevelObjectWithData(_:)
というわけで、こんな感じで試してみてください。
にデータを格納する場合
UserDefaults
let category = JobCategory(id: 1, name: "Test Category", URLString: "http://www.example-job.com")
let encodedData = NSKeyedArchiver.archivedData(withRootObject: category, requiringSecureCoding: false)
let userDefaults = UserDefaults.standard
userDefaults.set(encodedData, forKey: UserDefaultsKeys.jobCategory.rawValue)
からデータを取得する場合
UserDefaults
let decoded = UserDefaults.standard.object(forKey: UserDefaultsKeys.jobCategory.rawValue) as! Data
let decodedTeams = NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(decoded) as! JobCategory
print(decodedTeams.name)
関連
-
[解決済み】Xcode 10.2.1 Command PhaseScriptExecutionが0以外の終了コードで失敗した。
-
[解決済み] Xcode コマンド /usr/bin/codesign は終了コード 1 で失敗しました : errSecInternalComponent
-
[解決済み] シミュレーターiOS 13でダークモードを使用するには?
-
[解決済み] UITabBar アイコンが正しく表示されない
-
[解決済み] 新しいアウトレット接続を挿入できませんでした。という名前のクラスの情報が見つかりませんでした。
-
[解決済み] selector' の引数が '@objc' メソッド、プロパティ、またはイニシャライザを参照していない
-
[解決済み] Swift の performSegueWithIdentifier が動作しない。
-
[解決済み] viewDidLoad()は何のためにあるのですか?[重複]する
-
[解決済み] Swift カスタムオブジェクトの配列をプロパティ値でソートする方法
-
[解決済み】プロパティリスト以外のオブジェクトをNSUserDefaultsとして設定しようとした場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"宣言はファイルスコープでのみ有効 "について
-
[解決済み】iOS 9.0より前のUIStackView
-
[解決済み] エラーです。cocoapodsでRestKitをインストール後、「サンドボックスがPodfile.lockと同期していない...」と表示される
-
[解決済み] シミュレータへのサービス接続の開始に失敗しました Xcode
-
[解決済み] UICollectionView: 非Nilのレイアウトパラメータで初期化する必要があります。
-
[解決済み] SwiftUI vs Interface Builderとストーリーボード【非公開
-
[解決済み] UTF-8でエンコードされたNSDataをNSStringに変換します。
-
[解決済み] Swiftを使って音を鳴らすには?
-
[解決済み] 起動画面にカスタムクラス名が設定されない場合がある
-
[解決済み] UIViewAlertForUnsatisfiableConstraintsでトラップする方法は?