我有一个类,类内部是一个基于全局结构的(快速)数组。
我想将此类的数组保存到 NSUserDefaults 中。这是我的代码:
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()
}
}
我已经子类化为 NSObject,并且我知道我需要 NSCoding。但我没有找到任何方法将结构数组转换为 NSMuteableArray 或我可以存储的类似内容。到目前为止,唯一的想法是遍历每个条目并将其直接复制到新数组中,或者在整个项目中使用大量 Objective-C 代码,因此我永远不需要从 Swift 数组转换为 Objective-C 数组。这两件事都是我不想做的。
Swift 结构不是类,因此它们不符合AnyObject
协议。你必须重新考虑你的方法。以下是一些建议:
-
转换你的struct
to final class
强制不变性
final class MyStruct {
let start : NSDate = NSDate()
let stop : NSDate = NSDate()
}
encoder.encodeObject(mystructs)
-
将它们映射为类型的数组字典[String: NSDate]
let structDicts = mystructs.map { ["start": $0.start, "stop": $0.stop] }
encoder.encodeObject(structDicts)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)