致命错误:意外地发现零,而解包可选值(当添加到数组)
我有一些代码从segue接收值,并用我有的索引号replace数组中的某个元素。
variables的初始化是:
var noteTitles: [String] = ["Sample Note"] var noteBodies: [String] = ["This is what lies within"] var selectedNoteIndex: Int! var newTitle: String! var newBody: String!
我有一个segue,使最后的3个值,我希望他们的价值观。
在viewDidLoad()下,我有这个:
if newTitle == nil && newBody == nil { } else { println("\(newTitle)") println("\(newBody)") println("\(selectedNoteIndex)") let realTitle: String = newTitle let realBody: String = newBody let realIndex: Int = selectedNoteIndex noteTitles[realIndex] = realTitle noteBodies[realIndex] = realBody }
我的日志显示这个:
New Note Title This is what lies within nil fatal error: unexpectedly found nil while unwrapping an Optional value
我得到了
Thread 1: EXC_BAD_INSTRUCTION(code=EXC_i385_INVOP,subcode=0x0)
在线上
let realIndex: Int = selectedNoteIndex
谁能告诉我我做错了什么?
var varName: Type!
声明一个隐含的解包可选 。
这意味着当访问varName
值时,它将被自动解包,即不使用varName!
。
因此,使用let realIndex: Int = selectedNoteIndex
访问隐式解包的可选selectedNoteIndex
,当它的值实际上nil
导致出现错误。
苹果的Swift指南指出:
在稍后可能variables为零的情况下,不应该使用隐式解包的option。 如果您需要在variables的生命周期中检查nil值,请始终使用正常的可选types。
我得到这些错误的原因是因为在回到主视图的时候,我没有使用正确的展开顺序,而是使用另一个show segue,它删除了之前在视图控制器中的所有数据。 通过创buildunwind segue,我能够将值保留在细节视图之前,并防止错误。
因为您没有为selectedNoteIndex
赋值,所以它显示nil。 首先,你必须检查它是否不是零值。
if let selectedNoteIndex = realIndex{ let realIndex: Int = selectedNoteIndex }