在 Swift 中自定义 class 存档
Custom class archiving in Swift
我想存档和取消存档 swift 中的自定义对象,如下所示:
class Line : NSObject, NSCoding {
var start : CGPoint
init(start _start: CGPoint) {
start = _start
}
required init(coder aDecoder: NSCoder) {
// 1 - compile time error
self.start = aDecoder.decodeObjectForKey("start") as CGPoint
}
override init() {
}
func encodeWithCoder(aCoder: NSCoder) {
// 2 - compile time error
aCoder.encodeObject(start, forKey: "start")
}
}
1.编译时错误为:
类型 'CGPoint' 不符合协议 'AnyObject'
2.编译时错误为:
call
中的额外参数 'forKey'
如何存档和取消存档 CGPoint,我知道 CGPoint 被击中了,这就是问题所在,但如何解决?
提前致谢。
您可以 archive/unarchive CGPoint 使用:
encodeCGPoint:forKey:
和
decodeCGPointForKey:
也许你可以将 CGPoint 转换为 NSValue。
func encodeWithCoder(aCoder: NSCoder) {
var cgPointAsObject:NSValue = NSValue(CGPoint: start)
aCoder.encodeObject(cgPointAsObject, forKey: "start")
}
在解码时同样反向处理将 NSValue 转换为 CGpoint。
在 swift3
中有一些 func
更改,如下所示:
class UserModel: NSObject,NSCoding {
var username:String = ""
var password: Int = 0
required init(coder aDecoder: NSCoder) {
super.init()
}
override init() {
}
func encode(with aCoder: NSCoder) {
}
}
我想存档和取消存档 swift 中的自定义对象,如下所示:
class Line : NSObject, NSCoding {
var start : CGPoint
init(start _start: CGPoint) {
start = _start
}
required init(coder aDecoder: NSCoder) {
// 1 - compile time error
self.start = aDecoder.decodeObjectForKey("start") as CGPoint
}
override init() {
}
func encodeWithCoder(aCoder: NSCoder) {
// 2 - compile time error
aCoder.encodeObject(start, forKey: "start")
}
}
1.编译时错误为: 类型 'CGPoint' 不符合协议 'AnyObject'
2.编译时错误为: call
中的额外参数 'forKey'如何存档和取消存档 CGPoint,我知道 CGPoint 被击中了,这就是问题所在,但如何解决?
提前致谢。
您可以 archive/unarchive CGPoint 使用:
encodeCGPoint:forKey:
和
decodeCGPointForKey:
也许你可以将 CGPoint 转换为 NSValue。
func encodeWithCoder(aCoder: NSCoder) {
var cgPointAsObject:NSValue = NSValue(CGPoint: start)
aCoder.encodeObject(cgPointAsObject, forKey: "start")
}
在解码时同样反向处理将 NSValue 转换为 CGpoint。
在 swift3
中有一些 func
更改,如下所示:
class UserModel: NSObject,NSCoding {
var username:String = ""
var password: Int = 0
required init(coder aDecoder: NSCoder) {
super.init()
}
override init() {
}
func encode(with aCoder: NSCoder) {
}
}