gpt4 book ai didi

ios - Swift 无法取消归档数据

转载 作者:行者123 更新时间:2023-11-28 16:02:33 25 4
gpt4 key购买 nike

我有一个包含以下内容的 UIView 子类:

class someClass: UIView {
var someString = ""
var imageView: UIImageView
var position: CGPoint
var dimensions: CGFloat

init(position: CGPoint, dimensions: CGFloat, someString: String) {
self.position = position
self.dimensions = dimensions
self.someString = someString
self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: dimensions, height: dimensions))
super.init(frame: CGRect(x: position.x, y: position.y, width: dimensions, height: dimensions))
addSubview(imageView)
}
}

我还添加了 required init?(coder aDecoder: NSCoder)encodeWithCoder(coder: NSCoder):

required init?(coder aDecoder: NSCoder) {
self.someString = aDecoder.decodeObject(forKey: "someString") as! String
self.position = aDecoder.decodeObject(forKey: "position") as! CGPoint
self.dimensions = aDecoder.decodeObject(forKey: "dimensions") as! CGFloat
self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: dimensions, height: dimensions))
super.init(frame: CGRect(x: position.x, y: position.y, width: dimensions, height: dimensions))
self.addSubview(imageView)
}

func encodeWithCoder(coder: NSCoder) {
coder.encode(self.position, forKey: "position")
coder.encode(self.dimensions, forKey: "dimensions")
coder.encode(self.someString, forKey: "someString")
}

所以,我创建了一个类的对象:

let someObject = someClass(position: CGPoint(x: 2.0, y: 3.0), dimensions: 10.0, someString: "Hello")

我正在尝试归档对象:

let archivedObject = NSKeyedArchiver.archivedData(withRootObject: someObject)

然后解压:

let unarchivedObject = NSKeyedUnarchiver.unarchiveObject(with: archivedObject) as! someClass

这里我遇到了错误:

my error

如果打印 unarchivedObject 它将是“ fatal error :在展开可选值时意外发现 nil”。

有人可以帮我解决这个问题吗?怎么了?

最佳答案

看起来问题是您没有正确覆盖 encodeWithEncoder。如果您在该函数内放置一个断点,您会发现它永远不会被调用,这就是为什么当您尝试对其进行解码时该对象为 nil - 它从未被编码!

尝试在 CGPoint 上使用 decodeObject 时,您也会遇到错误。确保也更改该行,然后您应该开始营业。

顺便说一句,通常的做法是将类名大写,以便它们与该类的实例不同,因此我将 someClass 更改为 SomeClass

class SomeClass: UIView {
var someString = ""
var imageView: UIImageView
var position: CGPoint
var dimensions: CGFloat

init(position: CGPoint, dimensions: CGFloat, someString: String) {
self.position = position
self.dimensions = dimensions
self.someString = someString
self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: dimensions, height: dimensions))
super.init(frame: CGRect(x: position.x, y: position.y, width: dimensions, height: dimensions))
addSubview(imageView)
}

required init?(coder aDecoder: NSCoder) {
self.someString = aDecoder.decodeObject(forKey: "someString") as! String
self.position = aDecoder.decodeCGPoint(forKey: "position")
self.dimensions = aDecoder.decodeObject(forKey: "dimensions") as! CGFloat
self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: dimensions, height: dimensions))
super.init(frame: CGRect(x: position.x, y: position.y, width: dimensions, height: dimensions))
self.addSubview(imageView)
}

override func encode(with aCoder: NSCoder) {
aCoder.encode(self.position, forKey: "position")
aCoder.encode(self.dimensions, forKey: "dimensions")
aCoder.encode(self.someString, forKey: "someString")
}

}

关于ios - Swift 无法取消归档数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40794658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com