即使有检查,空值也会出现快速错误访问错误
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 错误