Swift:当变量不是可选时,处理意外的 nil 值
Posted
技术标签:
【中文标题】Swift:当变量不是可选时,处理意外的 nil 值【英文标题】:Swift: handling an unexpected nil value, when variable is not optional [duplicate] 【发布时间】:2015-03-13 10:09:51 【问题描述】:我有一个 UITableViewController
通过 NSFetchedResultsController
从 Core Data 加载其条目。像这样:
let historyItem = fetchedResults.objectAtIndexPath(indexPath) as HistoryItem
historyItem
有一个 title
属性定义如下:
@NSManaged var title: String
所以在cellForRowAtIndexPath
代码中说
cell?.textLabel?.text = historyItem.title
应该没问题。 title
不是可选的,不需要解包。
然而,在过去,存储的Core Data已经获取了一些title
属性值为nil
的对象。它们存储在那里,等待导致错误。如果其中一个对象显示在单元格中,我会在上面的 Swift 代码行中看到运行时地址异常,其中地址为 0。
为了稳健性,我需要编写代码以确保传递给我的程序的存储数据不会导致崩溃。但是,我不会写
if historyItem.title == nil // gives compiler error
因为title
不是可选的,编译器不会让我这样做。如果我写
let optionalTitle:String? = historyItem.title
我仍然在该行获得运行时 EXC_BAD_ACCESS
。
如何检查title
是否错误地为零?
谢谢!
【问题讨论】:
我已关闭为副本,因为我认为这是同样的问题。如果这些解决方案不适用于您的情况,请告诉我,然后我将重新提出问题。 是的,情况完全一样(我在搜索中没有找到),但是那里的高分解决方案不起作用。我会问另一个问题来指出这一点。谢谢! 我在***.com/questions/29031080/…问了另一个问题 【参考方案1】:由于您有 nil 值,因此 title
属性应该是可选的,并且您应该在核心数据模型和 NSManagedObject
historyItem 类中将其声明为可选。
【讨论】:
如果我只是将标题的类型更改为字符串?,(并通过代码更改所有使用标题的地方,将其解包)然后核心数据代码会给出运行时错误。我可以写一个迁移器,也许……但我宁愿只检查意外的 nil 值。【参考方案2】:当我在编辑器中执行此操作时,我没有收到错误,因此可能是答案:
let a = ""
if a as String? == nil
println("Nil")
else
println("Not nil")
【讨论】:
看起来很有希望!不幸的是,它不起作用。如果我写if historyItem.title as String? == nil t = "was Nil"
,那么如果 title 为 nil,我会得到 EXC_BAD_ACCESS。
试试if let historyItemTitle = historyItem.title as? String "historyItem.title not nil" else "historyItem.tile is nil"
或者,如果您将标题设为 :String!这将启用零比较。【参考方案3】:
@NSManaged var title: String
应该是 @NSManaged var title: String?
如果有可能为 nil 值。那么,可选绑定就不会出错:
if let historyItemTitle = historyItem.title
cell?.textLabel?.text = historyItemTitle
else
cell?.textLabel?.text = "Title missing"
【讨论】:
以上是关于Swift:当变量不是可选时,处理意外的 nil 值的主要内容,如果未能解决你的问题,请参考以下文章
使用 View Controller 作为辅助视图的委托失败,在展开可选时意外发现 nil
Swift - 在展开可选值时意外发现 nil - 从委托调用变量