使用 NSFileManager 检索多个值时收到“致命错误:在展开可选值时意外发现 nil”

Posted

技术标签:

【中文标题】使用 NSFileManager 检索多个值时收到“致命错误:在展开可选值时意外发现 nil”【英文标题】:"fatal error: unexpectedly found nil while unwrapping an Optional value" received when using NSFileManager to retrieve multiple values 【发布时间】:2015-04-23 16:22:13 【问题描述】:

当我尝试使用 NSFileManager 检索多个值时收到以下错误:fatal error: unexpectedly found nil while unwrapping an Optional value

这是我的代码:

class func loadGameData() -> (HighScore: Int, HasCompletedTutorial: Bool) 
    // getting path to GameData.plist
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let documentsDirectory = paths[0] as! String
    let path = documentsDirectory.stringByAppendingPathComponent("GameData.plist")
    let fileManager = NSFileManager.defaultManager()

    //check if file exists
    if(!fileManager.fileExistsAtPath(path)) 
        // If it doesn't, copy it from the default file in the Bundle
        if let bundlePath = NSBundle.mainBundle().pathForResource("GameData", ofType: "plist") 
            let resultDictionary = NSMutableDictionary(contentsOfFile: bundlePath)
            fileManager.copyItemAtPath(bundlePath, toPath: path, error: nil)
        
    

    let resultDictionary = NSMutableDictionary(contentsOfFile: path)
    var myDict = NSDictionary(contentsOfFile: path)

    if let dict = myDict 
        //loading values - THIS IS WHERE THE ERROR OCCURS
        let HighScore: AnyObject = dict.objectForKey("HighScore")!
        let CompletedTutorial: AnyObject = dict.objectForKey("HasCompletedTutorial")! 

        return (Int(HighScore as! NSNumber), Bool(CompletedTutorial as! NSNumber))
    

    return (0, false)

我自己测试了这两条线,它们运行良好。但他们似乎没有一起工作

这里是调用函​​数的代码

let val = GameData.loadGameData()
println(val.HighScore)
println(val.HasCompletedTutorial)

我已经测试了这个函数调用的多个变体,但没有任何区别

谢谢

【问题讨论】:

您在哪一行得到错误? 'paths' 是 nil 吗? @RehcsifMit 错误发生在这两行:let HighScore: AnyObject = dict.objectForKey("HighScore")! let CompletedTutorial: AnyObject = dict.objectForKey("HasCompletedTutorial")! 除非你的字典保证有这些键,否则你最好使用'?'解包并显式检查 nil。 【参考方案1】:

你为什么不打开它们呢?试试这样的

if let dict = myDict 
    if let 
      highScore = dict.objectForKey("HighScore"), 
      completedTutorial = dict.objectForKey("HasCompletedTutorial") 
    
        return (Int(highScore as! NSNumber), Bool(completedTutorial as! NSNumber))
    

【讨论】:

以上是关于使用 NSFileManager 检索多个值时收到“致命错误:在展开可选值时意外发现 nil”的主要内容,如果未能解决你的问题,请参考以下文章

NSFileManager 不保存数据

如何使用 NSFileManager 复制 UNIX 可执行文件?

尝试在 SQL 中插入多个值时如何修复语句结尾?

NSFileManager 线程安全

检查 AAR 元数据值时发现的一个或多个问题:

NSFileManager 没有删除临时文件夹中的文件