2015-11-21 30 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") 
    } 
}