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

Swift - 在展开可选值时意外发现 nil - 从委托调用变量

SWIFT - 致命错误:在展开可选值时意外发现 nil