我正面临一个错误:"在解包一个可选值" 时意外地发现了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中并可见。问题是什么?
答案 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/
如果你看看关于选项的部分,这一点应该更清楚。在堆栈溢出时,您通常会首先尝试为自己找到答案,并了解基本理论。不幸的是,这就是为什么你得到这么多的选票。我希望这有帮助。
如果这对您有帮助,请点击旁边的复选标记接受此答案。