即使检查,空值上的Swift错误访问错误

时间:2015-07-10 10:30:49

标签: swift

我正在从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声明会阻止这个问题,但它没有。

我在这里做错了什么?

enter image description here

更新

这是核心数据获取的详细视图。

NSManagedObject设为

var receivedVisitDetails: VisitDetails! = nil

上一个视图中的prepareForSeague

let visits:VisitDetails = fetchedResultsController.objectAtIndexPath(indexPath!) as! VisitDetails
            taskController.receivedVisitDetails = visits

只有当clinNotes为空时才会发生崩溃。

2 个答案:

答案 0 :(得分:1)

在所有编辑和评论之后,问题出现在:

@NSManaged var clinicNotes: String

它在您的Core Data模型中是可选的,但不在您的班级中。应改为:

@NSManaged var clinicNotes: String?

这是similar问题,Imanou建议mogenerator,它可以为您处理。它会为每个托管对象自动生成两个类。人体部分适合编辑(更新模型时未被生成器触及)并且机器不适合编辑(每次更新模型时都重写)。人体部分继承自机器部分。

每当我使用Core Data时,我都会使用它。我也强烈建议。您还可以将其添加到构建阶段,因此,它会在您构建项目时自动更新您的机器类。

答案 1 :(得分:-1)

使用此构造时,您不必使用?,因为它是为您打开的。

if let clinic = receivedVisitDetails.clinicNotes {
            cell.textLabel?.text = clinic
        }