2017-03-01 1 views
0

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 '

Antwort

0

Der Code in der Frage grundsätzlich funktioniert. Der Fehler muss woanders liegen.

ich diesen Code in einem Spielplatz getestet, vielleicht ist es ein Hinweis, wie Sie das Archivierungs/Entpacker verwenden:

let defaultHistory = UserDefaultHistory(saveDate: "2017/3/1") 
let statement = UserDefaultStatement(statementHistory: defaultHistory) 

// archive the class to Data 
let data = NSKeyedArchiver.archivedData(withRootObject: statement) 
print(data as NSData) // the type cast prints the raw data rather than "xy bytes" 

// unarchive the data to class 
let restoredStatement = NSKeyedUnarchiver.unarchiveObject(with: data) as! UserDefaultStatement 
restoredStatement.statementHistory[0].saveDate // "2017/3/1" 

PS: Wie in Ihrer vorherigen Frage erwähnt Sie [UserDefaultHistory], so dass Sie auf jeden Fall erhalten [UserDefaultHistory] zu archivieren wollen zurück (decodeObject(forKey: "owedHistoryArray") as! [UserDefaultHistory])). Und Sie werden immer eine nicht optionale Zeichenfolge in UserDefaultHistory haben. Keine Notwendigkeit, ein optionales zu verwenden.

+0

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

+0

Verwenden Sie mein Beispiel, wie Sie den Unarchivierer anwenden. 'historyArray' ist' [Data] 'in Swift. – vadian

+0

Was ist, wenn die Daten bereits archiviert sind, und ich müsste das verwenden? – icekomo

Verwandte Themen