2

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

变量的初始化是:

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

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

4

3 回答 3

1

var varName: Type!声明一个隐式展开的 optional

这意味着它会在使用 访问值时自动解包varName,即不使用varName!

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


Apple 的 Swift 指南指出:

当变量有可能在以后变为 nil 时,不应使用隐式展开的选项。如果您需要在变量的生命周期内检查 nil 值,请始终使用正常的可选类型。

于 2015-02-06T05:39:03.010 回答
0

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

于 2015-06-13T02:35:55.443 回答
-1

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

if let selectedNoteIndex = realIndex{
    let realIndex: Int = selectedNoteIndex
}
于 2015-02-06T05:38:55.740 回答