【发布时间】:2016-06-04 08:00:37
【问题描述】:
我遇到了一个错误:“在展开可选值时意外发现 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[genre]!.append(movie)”,但如果我重新加载应用程序,我的数据将存储并在 tableview 中可见。有什么问题?
【问题讨论】:
-
您是否在 Stack Overflow 上搜索过现有答案?
-
阅读可选绑定和一般可选:Swift中的一个关键概念,我怀疑你还没有完全掌握,看到您的强制解包
... = movie.genre!和... loadMovie[genre]!。请注意,当编译器要求您解包选项时,您不应盲目相信编译器:在其当前状态下,它通常只会询问您是否要执行强制解包 (!),这通常是一个不好的建议编译器。我个人怀疑,关于 SO 的所有 “意外发现 nil ...” 问题中的很大一部分都是基于对编译器建议的健全性的信任。 -
在我提出的解决方案中,
genre是非可选的。您更改了它,这会导致错误。为了使用genre作为部分标识符,您需要一个非可选值。 -
@user1679705 再说一遍:不要相信这里的编译器建议,而是阅读例如optional binding。我敦促您在继续您的 Swift 之旅之前掌握可选项的概念以及如何安全地解开它们(这很可能会为您节省很多时间,并让您避免许多常见的 Swift 初学者陷阱)。跨度>
-
@vadian 不管怎样,我不认为我们可以说可选项在 Swift 中不是一个重要的概念,即使它可能是最佳实践 i> 尽可能使用非可选类型(对此我不会说是或否;我经常使用可选类型,但也许这是我自己缺乏的......)。后者不应排除指出前者,否则我们迟早会从 OP 那里得到另一个关于强制解包选项的问题。您对课程细节的反馈/...
Movie可能对 OP 解决这个问题很有价值;但可选选项在这里非常重要。
标签: ios swift uitableview core-data