致命错误:在展开可选值时意外发现 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