Mam klasę i wewnątrz klasy jest (szybka) tablica, oparta na globalnej strukturze. Chcę zapisać tablicę z tą klasą do NSUserDefaults. To jest mój kod:Zapisz struct w klasie do NSUserDefaults przy użyciu Swift
struct mystruct {
var start : NSDate = NSDate()
var stop : NSDate = NSDate()
}
class MyClass : NSObject {
var mystructs : [mystruct]
init(mystructs : [mystruct]) {
self.mystructs = mystructs
super.init()
}
func encodeWithCoder(encoder: NSCoder) {
//let val = mystructs.map { $0 as NSObject } //this also doesn't work
let objctvtmrec = NSMutableArray(mystructs) //gives error
encoder.encodeObject(objctvtmrec)
//first approach:
encoder.encodeObject(mystructs) //error: [mystructs] doesn't conform to protocol 'anyobject'
}
}
var records : [MyClass] {
get {
var returnValue : [MyClass]? = NSUserDefaults.standardUserDefaults().objectForKey("records") as? [MyClass]
if returnValue == nil
{
returnValue = []
}
return returnValue!
}
set (newValue) {
let val = newValue.map { $0 as AnyObject }
NSUserDefaults.standardUserDefaults().setObject(val, forKey: "records")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
Już podklasowałem do NSObject i wiem, że potrzebuję NSCoding. Ale nie znajduję żadnego sposobu na przekonwertowanie tablicy struct na NSMuteableArray lub coś podobnego, którą mogę przechowywać. Jedynym pomysłem do tej pory jest przejrzenie każdego wpisu i skopiowanie go bezpośrednio do nowej tablicy lub użycie kodu lub kodu obiektowego w całym projekcie, więc nigdy nie będę musiał konwertować z tablic szybkich na tablice cel-c. Oba są rzeczami, których nie chcę robić.
'let structDicts = mystructs.map {[" start ": $ 0.start," stop ": 0 $.stop]} ' -> błąd krytyczny: element NSArray nie pasuje do elementu Swift Array Element – Thomas