致命错误:意外地发现零,而解包可选值(当添加到数组)

我有一些代码从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 }