即使有检查,空值也会出现快速错误访问错误

Posted

技术标签:

【中文标题】即使有检查,空值也会出现快速错误访问错误【英文标题】: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 【参考方案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 构造中也必须有? ...否则您将得到未解包的可选类型的值...我> 我的错,我把两件事搞混了。对不起

以上是关于即使有检查,空值也会出现快速错误访问错误的主要内容,如果未能解决你的问题,请参考以下文章

即使创建表的语法正确,我的 sql 中也会出现错误 1064

即使 IAM 角色具有完整的 Redshift 权限,AWS Lambda 在调用 Redshift 的“CreateCluster”操作时也会出现“拒绝访问”错误

Spring Boot 2.0.3 Oauth2 安全性:即使在标头中使用访问令牌时也会出现 401 错误

即使没有发出预检请求,也会在 POST 请求中出现 CORS 错误

为啥即使没有错误,表单也会出现错误消息?

即使似乎授予访问权限,Google Calendar API在OAuth期间也会出现403错误