Xcode 12 と Swift 5 環境で iOS アプリケーションを構築しています。
ビューが消える前 (またはアプリが閉じる前) に OpaquePointer 型の変数 (以下のコードでは「self.loggers」) を保存し、ビューが表示されたとき (アプリの実行時) にそれを取得する必要があります。以下のように UserDefault を使用しようとしましたが、
// Storing(In viewWillDisappear)
do {
encodedData = try NSKeyedArchiver.archivedData(withRootObject: self.loggers, requiringSecureCoding: false)
UserDefaults.standard.set(encodedData, forKey: "accelLoggerID")
} catch {
print("archiving error")
}
...
// Retrieving(In viewDidLoad)
if let decodedData = UserDefaults.standard.object(forKey: "acceleration") as? Data {
do {
self.loggers = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(decodedData) as? [String:OpaquePointer] ?? [:]} catch {
print("unarchiving error")
}
} else {
self.loggers = [:]
print("No value in Userdefault. [viewDidLoad]")
}
ただし、NSKeyedArchiver はそのような型のエンコードに失敗しました。その後、変数をラップするクラスを作りました。
class LoggerWrapper {
var loggers: [String : OpaquePointer]
init(loggerDic: [String : OpaquePointer]) {
loggers = loggerDic
}
}
そして私のコードを次のように変更しました
self.loggers = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(decodedData) as? LoggerWrapper ?? LoggerWrapper(loggerDic: [:])} catch {
print("unarchiving error")
}
ただし、これにより、NSKeyedArchiver.archivedData が呼び出されたときに SIGABRT が返されます。UserDefaults に Opaquepointer タイプを格納する方法はありますか? そうでない場合、コアデータを使用してこの問題を解決できますか?
ありがとうございました。