Ich versuche, ein Array aus NSUserDefaults zu erstellen. Die alte App ist in Obj C, ich dachte, dass meine userdefaults vom Dateityp NSArray mit dem Array war, das eine benutzerdefinierte Klasse namens GD_Owed_HistoryObject enthielt.Der NSUserdefaults-Decoder führt dazu, dass das NSArray-Element dem Swift-Array-Elementtyp nicht entspricht
Ich habe versucht, diese Klasse zu entschlüsseln und sie in der neuen App verwendet mit Swift 3
@objc(GD_Owed_HistoryObject)
class UserDefaultHistory: NSObject, NSCoding {
let saveDate: String?
init(saveDate: String) {
self.saveDate = saveDate
}
required init(coder decoder: NSCoder) {
self.saveDate = (decoder.decodeObject(forKey: "owedSaveDate") as? String)
}
func encode(with coder: NSCoder) {
coder.encode(saveDate, forKey: "owedSaveDate")
}
}
ich die Zählung meiner Array zu bekommen, und es hat die richtige Anzahl der Objekte in der es
print("\(statementHistory.count) is the array count") // 3
ich habe auch versucht, um herauszufinden, welche Art von Objekten in meinem Array sind
print("\(type(of: statementHistory)) type of array") // UserDefaultStatement
UserDefaultStatement ist was ich vermutete, dass ich von NSUserdefaults zurückkam. Also habe ich versucht, dies zu verwenden, um den Array
import UIKit
@objc(GD_Owed_Bill)
class UserDefaultStatement: NSObject, NSCoding {
var statementHistory: [UserDefaultHistory]
init(statementHistory: UserDefaultHistory) {
self.statementHistory = [statementHistory]
}
required init(coder decoder: NSCoder) {
self.statementHistory = (decoder.decodeObject(forKey: "owedHistoryArray") as! Array)
}
func encode(with coder: NSCoder) {
coder.encode(statementHistory, forKey: "owedHistoryArray")
}
}
zu schaffen, aber wenn ich versuche, und eine Eigenschaft Zugriff auf UserDefaultHistory bekomme ich diesen Fehler.
fatal error: NSArray element failed to match the Swift Array Element type
2017-03-01 11:58:37.411214 owed[1230:571980] fatal error: NSArray element failed to match the Swift Array Element type
Ich habe daran gearbeitet für 2 Tage mit nicht allot Fortschritt. Ich denke, ich ordne den Array-Typ falsch zu, aber ich weiß nicht, wie ich fragen soll, welche Art von Objekt ich von meiner Decodierung zurückbekomme.
aktualisieren Nachdem er einige Zeit mit der alten App verbringen scheint es, dass ich die Objekte NSKeyArchived, zu urteilen, was ich, sie zu benutzen tun musste.
Ich bin gerade jetzt genau sicher, wie ich mein Array mit den archivierten Objekten darin nehme und entpacke. statementHistory würde meine Array mit den archivierten Elementen
aktualisieren
var historyArray = statementHistory
let restoredStatement = NSKeyedUnarchiver.unarchiveObject(with: historyArray) as! UserDefaultHistory
restoredStatement.statementHistory[0].saveDate
Aber ich habe diesen Fehler sein: Cannot convert value ot type '[UserDefaultHistory]' ot expected argument type 'Data
'
Ich glaube, ich mache Fortschritte! Nach dem Betrachten des ursprünglichen Codes scheint es, als ob die Objekte, die sich im Array befinden, NSKeyArchived sind. Ich bin mir nicht sicher, ob so etwas den fatalen Fehler verursachen würde oder nicht. Ich werde die Frage aktualisieren, was ich gefunden habe – icekomo
Verwenden Sie mein Beispiel, wie Sie den Unarchivierer anwenden. 'historyArray' ist' [Data] 'in Swift. – vadian
Was ist, wenn die Daten bereits archiviert sind, und ich müsste das verwenden? – icekomo