致命错误:在展开可选值时意外发现 nil(添加到数组时)

Posted

技术标签:

【中文标题】致命错误:在展开可选值时意外发现 nil(添加到数组时)【英文标题】:fatal error: unexpectedly found nil while unwrapping an Optional value(When adding to a array) 【发布时间】:2015-02-06 05:29:49 【问题描述】:

我有一些代码从 segue 接收值并用我拥有的索引号替换数组的某个元素。

变量的初始化为:

var noteTitles: [String] = ["Sample Note"]
var noteBodies: [String] = ["This is what lies within"]
var selectedNoteIndex: Int!
var newTitle: String!
var newBody: String!

我有一个转场,使最后 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

谁能告诉我我做错了什么?

【问题讨论】:

BTW Swift 是一种类型推断语言。试试看!!! 【参考方案1】:

var varName: Type! 声明了一个隐式解包的可选

表示使用varName访问值时会自动解包,即不使用varName!

因此,当它的值实际上是 nil 时,使用 let realIndex: Int = selectedNoteIndex 访问隐式展开的可选 selectedNoteIndex 会导致您遇到错误。


Apple 的 Swift 指南指出:

当存在 变量在以后变为 nil 的可能性。始终使用 如果您需要在运行期间检查 nil 值,则为普通可选类型 变量的生命周期。

【讨论】:

【参考方案2】:

我收到这些错误的原因是,在转回主视图时,我没有使用正确的展开转场,而是使用了另一个显示转场,这会删除之前在视图控制器中的所有数据。通过创建展开转场,我能够将转场之前的值保留到详细视图并防止错误。

【讨论】:

【参考方案3】:

因为您没有为 selectedNoteIndex 赋值,所以它显示为 nil。首先,你必须检查它是否不是 nil 值。

if let selectedNoteIndex = realIndex
    let realIndex: Int = selectedNoteIndex

【讨论】:

这不是可选绑定的使用方式——试试if let realIndex = selectedNoteIndex ...

以上是关于致命错误:在展开可选值时意外发现 nil(添加到数组时)的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:在 UITableViewCell 中展开可选值时意外发现 nil

CollectionView 致命错误:在展开可选值时意外发现 nil

奇怪的“致命错误:在展开可选值时意外发现 nil”

致命错误:在展开可选值时意外发现 nil - 为啥?

Swift 错误致命错误:在展开可选值时意外发现 nil

@IBInspectable 致命错误:在展开可选值时意外发现 nil