【问题标题】:Swift bad access error on empty value even with check即使有检查,空值也会出现快速错误访问错误
【发布时间】:2015-07-10 10:30:49
【问题描述】:

我正在从 Obj-C 过渡到 Swift,我认为我对 ? !概念。但是,我在一个为零的字段上遇到了糟糕的访问崩溃。

我正在使用

var cell :ContactIInfoTableViewCell!

cell = tableView.dequeueReusableCellWithIdentifier("notes", forIndexPath: indexPath) as! ContactIInfoTableViewCell
            if let clinic = receivedVisitDetails?.clinicNotes {
                cell.textLabel?.text = clinic
            }

如果为空,则会产生错误。我的理解是 IF 语句会阻止这个问题,但它没有。

我在这里做错了什么?

更新

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

NSManagedObject 设置为

var receivedVisitDetails: VisitDetails! = nil

上一个视图上的prepareForSeague

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

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

【问题讨论】:

  • 能否也发布崩溃日志?
  • 在上面添加了一个sn-p
  • 你能显示设置 receivedVisitDetails 的代码吗?
  • Nit pick(与崩溃无关) - 无需使用ContactIInfoTableViewCell!,我的意思是!,因为dequeueReusableCellWithIdentifier(_:forIndexPath:) 总是返回有效的UITableViewCell,请查看此方法的文档。返回类型为UITableViewCell
  • 嗯,当我阅读您的所有更新/编辑时,如果在您的核心数据模型中是可选的,不应该是您的 clinitNotes 类型 String? 而不是 String

标签: swift


【解决方案1】:

经过所有的编辑和cmets,问题出在:

@NSManaged var clinicNotes: String

它在您的核心数据模型中是可选的,但在您的课程中不是。应改为:

@NSManaged var clinicNotes: String?

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

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

【讨论】:

    【解决方案2】:

    使用这种结构时,您不必使用?,因为它已为您解开。

    试试

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

    【讨论】:

    • 不,如果receivedVisitDetails 是可选的,那么即使在let 构造中也必须有? ...否则您将得到未解包的可选类型的值...我>
    • 我的错,我把两件事搞混了。对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2021-01-02
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多