Swift: 尝试实现 NSCoding
Swift: Trying to implement NSCoding
我正在尝试将 NSCoding 协议添加到我的自定义 class:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic.png")!
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.pic = aDecoder.decodeObjectForKey("pic") as! UIImage
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeObject(self.pic, forKey: "pic")
}
}
但它在以下行弹出错误:
self.pic = aDecoder.decodeObjectForKey("pic") as! UIImage
控制台中的错误是:
fatal error: unexpectedly found nil while unwrapping an Optional value
而xcode中的错误是:
Thread 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)
我不知道该怎么办。
编辑:
当运行这个代码:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage!
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic.png")!
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.pic = aDecoder.decodeObjectForKey("pic") as? UIImage
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeObject(self.pic, forKey: "pic")
}
}
它编译正常,但是 self.pic 最后是 nil 而不是 UIImage (named: "NoPic.png")
您确定您的资产中有所需的图像吗?
"NoPic.png"
好的,这里有一些变化:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage?
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic")
super.init()
}
它适用于我,但您必须确保图像存在于您的资产中。您可以跳过 .png 格式
这个有效:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage?
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic.png")
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.pic = aDecoder.decodeObjectForKey("pic") as? UIImage
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeObject(self.pic, forKey: "pic")
}
}
我正在尝试将 NSCoding 协议添加到我的自定义 class:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic.png")!
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.pic = aDecoder.decodeObjectForKey("pic") as! UIImage
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeObject(self.pic, forKey: "pic")
}
}
但它在以下行弹出错误:
self.pic = aDecoder.decodeObjectForKey("pic") as! UIImage
控制台中的错误是:
fatal error: unexpectedly found nil while unwrapping an Optional value
而xcode中的错误是:
Thread 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)
我不知道该怎么办。
编辑: 当运行这个代码:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage!
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic.png")!
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.pic = aDecoder.decodeObjectForKey("pic") as? UIImage
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeObject(self.pic, forKey: "pic")
}
}
它编译正常,但是 self.pic 最后是 nil 而不是 UIImage (named: "NoPic.png")
您确定您的资产中有所需的图像吗? "NoPic.png"
好的,这里有一些变化:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage?
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic")
super.init()
}
它适用于我,但您必须确保图像存在于您的资产中。您可以跳过 .png 格式
这个有效:
class Convo: NSObject, NSCoding {
var name: String
var pic: UIImage?
override init() {
self.name = "Dror"
self.pic = UIImage (named: "NoPic.png")
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.pic = aDecoder.decodeObjectForKey("pic") as? UIImage
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeObject(self.pic, forKey: "pic")
}
}