我正在从 Obj-C 过渡到 Swift,我想我对 ? !概念。但是,我在一个为 nil 的字段上遇到了严重的访问崩溃。
我正在使用
var cell :ContactIInfoTableViewCell!
cell = tableView.dequeueReusableCellWithIdentifier("notes", forIndexPath: indexPath) as! ContactIInfoTableViewCell
if let clinic = receivedVisitDetails?.clinicNotes {
cell.textLabel?.text = clinic
}
如果为空则产生错误。我的理解是 IF 语句会阻止这个问题,但事实并非如此。
我在这里做错了什么?
更新
这是核心数据获取的详细 View 。
NSManagedObject
设置为
var receivedVisitDetails: VisitDetails! = nil
上一个 View 中的prepareForSeague
let visits:VisitDetails = fetchedResultsController.objectAtIndexPath(indexPath!) as! VisitDetails
taskController.receivedVisitDetails = visits
只有当 clinicNotes 为空时才会发生崩溃。
最佳答案
经过所有的编辑和评论,问题出在:
@NSManaged var clinicNotes: String
它在您的 Core Data 模型中是可选的,但在您的类中不是。应该改为:
@NSManaged var clinicNotes: String?
这是 similar Imanou 建议的问题 mogenerator ,它可以为您处理。它会自动为每个托管对象生成两个类。人的部分适合编辑(更新模型时不被 mogenerator 触及),机器不适合编辑(每次更新模型时都会重写)。人的部分继承自机器的部分。
每当我使用 Core Data 时,我都会使用它。我也强烈建议这样做。您还可以将它添加到构建阶段,因此,它会在您构建项目时自动更新您的机器类。
关于即使有检查,空值也会出现 Swift 错误访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31338550/