Swift,在展开可选值时意外发现 nil (NSKeyedUnarchiver)
Posted
技术标签:
【中文标题】Swift,在展开可选值时意外发现 nil (NSKeyedUnarchiver)【英文标题】:Swift, unexpectedly found nil while unwrapping an Optional value (NSKeyedUnarchiver) 【发布时间】:2016-05-17 10:30:08 【问题描述】:我想通过以下方式将数组存储在缓存中。 但不知何故,我收到错误“unexpectedly found nil while unwrapping an Optional value”
下面是我的代码
从缓存加载
func loadCachedContacts()
let loadNSCachedContacts = NSUserDefaults.standardUserDefaults().objectForKey(constants.defaultsKeys.VISITED_CONTACTS_KEY) as? NSData
if let genericsData = loadNSCachedContacts
if let conArray = NSKeyedUnarchiver.unarchiveObjectWithData(genericsData) as?
[Generic] //**error comes here**
//if(conArray != nil)
// if let testArray = conArray
for generic in conArray
print("\(generic.genericCode), Cached Storage")
//
保存到缓存中
func storeVisitedContact(generic: Generic)
let def = NSUserDefaults.standardUserDefaults()
var readArray : [Generic] = []
// visitedContactsArr.append(generic)
if var testArray = def.objectForKey(constants.defaultsKeys.VISITED_CONTACTS_KEY) as? [Generic]
// readArray = testArray! as! [Generic]
if testArray.count>=constants.defaultsKeys.VISITED_CONTACTS_COUNT
testArray.removeFirst()
else
testArray.append(generic)
readArray = testArray
else
readArray.append(generic)
let archivedObject = NSKeyedArchiver.archivedDataWithRootObject(readArray as [Generic])
NSUserDefaults.standardUserDefaults().setObject(archivedObject, forKey: constants.defaultsKeys.VISITED_CONTACTS_KEY)
NSUserDefaults.standardUserDefaults().synchronize()
有人可以帮我解决一些问题吗? 使用 NSCoding 协议编辑
class Generic: NSObject, NSCoding
var genericCode = String("")
var genericName = String("")
var genericType = String("")
var genericImageUrl = String("")
var genericPhone = String("")
var orgName = String("")
var const = Constants()
override init()
//Parameterzed Constructor for the Generic
init(genericCode: String , genericName: String , genericPhone: String, genericType: String, genericImageUrl : String)
self.genericCode = genericCode
self.genericName = genericName
self.genericType = genericType
self.genericImageUrl = genericImageUrl
self.genericPhone = genericPhone
required init(coder aDecoder: NSCoder)
genericCode = aDecoder.decodeObjectForKey("genericCode") as! String
genericName = aDecoder.decodeObjectForKey("genericName") as! String
genericType = aDecoder.decodeObjectForKey("genericType") as! String
genericPhone = aDecoder.decodeObjectForKey("genericPhone") as! String
orgName = aDecoder.decodeObjectForKey("orgName") as! String
func encodeWithCoder(aCoder: NSCoder)
aCoder.encodeObject(genericCode, forKey: "genericCode")
aCoder.encodeObject(genericName, forKey: "genericName")
aCoder.encodeObject(genericType, forKey: "genericType")
aCoder.encodeObject(genericPhone, forKey: "genericPhone")
【问题讨论】:
错误出现在哪一行?此外,如果您为Generic
发布了NSCoding
协议实现,这可能会有所帮助。
@gabriel_101,在这一行有一个错误: if let conArray = NSKeyedUnarchiver.unarchiveObjectWithData(genericsData) as? [通用] ,....并且也编辑了我的代码
【参考方案1】:
您似乎没有为 func encodeWithCoder(aCoder: NSCoder)
中的键“orgName”编码任何值
当init(coder aDecoder: NSCoder)
运行时,它将尝试解码一个不存在的键“orgName”的值,因为它在encodeWithCoder(aCoder: NSCoder)
中被省略了。此密钥的解码将导致无法解包的 nil。
【讨论】:
这是一个陷阱......你已经抓住了完美的地方......谢谢加布里埃尔 没问题 :-) 很高兴我能帮上忙。以上是关于Swift,在展开可选值时意外发现 nil (NSKeyedUnarchiver)的主要内容,如果未能解决你的问题,请参考以下文章
swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称
Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil
Swift,在展开可选值时意外发现 nil (NSKeyedUnarchiver)
(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil