2015-11-21 26 views
0

我试着去NSCoding协议添加到我的自定义类:斯威夫特:想实现NSCoding

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到底是零,而不是UIImage的(命名为: “NoPic.png”)

+0

你的代码是很兴奋的与所有那些感叹号所有的地方! – nhgrif

回答

1

你确定你的资产中需要图片? “NoPic.png”

好吧,这里是一些变化:

class Convo: NSObject, NSCoding { 
    var name: String 
    var pic: UIImage? 

    override init() { 
     self.name = "Dror" 
     self.pic = UIImage (named: "NoPic") 
     super.init() 
    } 

它为我工作,但你必须确保图像在您的资产存在。您可以跳过巴纽格式

+0

现在它说“可选类型'UIImage的值'?不打开;你的意思是使用'!'要么 '?'?” –

+0

@DrorChen看我的更新 –

+0

是的,我确实把它添加到我的资产 –

0

这工作:

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") 
    } 
}