在展开Optional值时意外发现nil?

时间:2016-02-22 18:41:14

标签: ios swift uitableview core-data

我正面临一个错误:"在解包一个可选值" 时意外地发现了nil 当我在coreData中插入新数据并重新加载我的tableview时,我记得这个函数

  var unique = [String]()
  var loadMovie = [String:[Movie]]()


 func insertMovie(movie : Movie) {
    let genre = movie.genre!
    if unique.contains(genre) {
        loadMovie[genre]!.append(movie)
    } else {
        unique.append(genre)
        loadMovie[genre] = [movie]
    }
}

并获取数据:

 func fetchAndSetResults() {
    let app = UIApplication.sharedApplication().delegate as! AppDelegate
    let context = app.managedObjectContext
    let fetchRequest  = NSFetchRequest(entityName: "Movie")

    do {
        let movies = try context.executeFetchRequest(fetchRequest) as! [Movie]
        loadMovie.removeAll()
        for movie in movies {
        insertMovie(movie)
        }
    } catch let err as NSError {
        print(err.debugDescription)
    }
}

并且应用程序在线上粉碎了上面提到的错误:"的loadMovie [流派] !.追加(动画)"但如果我重新加载应用程序,我的数据将存储在tableview中并可见。问题是什么?

2 个答案:

答案 0 :(得分:0)

您展开的可选变量意味着您只需解决编译时错误。在swift中,你展开变量意味着它代表变量不会得到nil。你只是告诉编译器。但是现在你得到nil(运行时错误)你需要通过使用Optional Binding来处理它。 / p>

  if let movies = try context.executeFetchRequest(fetchRequest)
{
            loadMovie.removeAll()
}

答案 1 :(得分:0)

您的变量 loadMovie 是一个字典,其中包含字符串作为键和电影的数组,作为为每个键存储的内容。如果您收到错误&#34;在展开&#34;行<#>; 时,意外地找到了nil; loadMovie [genre]!。append(movie)&#34; 毫无疑问,名为流派的字符串有时不会存储为 loadMovie中的密钥字典。

使用下面的代码首先确保您可以为该密钥存储数据(存储在流派字符串中),如果您不能打印出字符串,那么您可以调试,找出缺少的密钥。

var unique = [String]()
var loadMovie = [String:[Movie]]()

func insertMovie(movie : Movie) {
    let genre = movie.genre!
    if unique.contains(genre) {
        if let genreArray = loadMovie[genre]{
            genreArray.append(movie)
        } else {
            NSLog("The missing genre: \(genre)")
        }
    } else {
        unique.append(genre)
        loadMovie[genre] = [movie]
    }
}

只要您想要一个可能为零(不存在)的值,您就可以使用上面的 if / let 模式。因此,对于您在评论中的第二个问题,您可以将 return loadMovie [genre] .count 替换为:

 if let genreArray = loadMovie[genre]{
     return genreArray.count
 } else {
     return 0  // zero because there are no items 
 }

还有其他方法。您应该查看一个很好的基本快速教程,例如:http://www.tutorialspoint.com/swift/

如果你看看关于选项的部分,这一点应该更清楚。在堆栈溢出时,您通常会首先尝试为自己找到答案,并了解基本理论。不幸的是,这就是为什么你得到这么多的选票。我希望这有帮助。

如果这对您有帮助,请点击旁边的复选标记接受此答案。