问题:我的非可选变量为零。 (展开时出现致命错误)

Posted

技术标签:

【中文标题】问题:我的非可选变量为零。 (展开时出现致命错误)【英文标题】:Problem: My non optional variable is nil. (Fatal Error while unwrapping) 【发布时间】:2020-01-28 06:16:28 【问题描述】:

我正在尝试更新 UILabel。

@IBOutlet weak var balanceLabel: UILabel!

它最初被声明为非可选变量:

var balanceValue: Int = 1

UILabel 依赖于非可选变量 balanceValue。

func updateBalanceLabel() 
        balanceLabel.text = String(balanceValue) 

一切都很好,但在某些时候我遇到了这个致命的错误,它不会消失:

线程 1:致命错误:在隐式展开可选值时意外发现 nil

错误是指这一行:

balanceLabel.text = String(balanceValue)

这没有任何意义...我有一个非可选变量,默认声明为 1。怎么可能是零。

这是崩溃日志:

> libswiftCore.dylib`_swift_runtime_on_report:
->  0x7fff51b801c0 <+0>: pushq  %rbp 
    0x7fff51b801c1 <+1>: movq   %rsp, %rbp
    0x7fff51b801c4 <+4>: popq   %rbp
    0x7fff51b801c5 <+5>: retq   
    0x7fff51b801c6 <+6>: nopw   %cs:(%rax,%rax)

ibswiftCore.dylib`Swift._assertionFailure(_: Swift.StaticString, _: Swift.String, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never:
    0x7fff518d9370 <+0>:  pushq  %rbp
    0x7fff518d9371 <+1>:  movq   %rsp, %rbp
    0x7fff518d9374 <+4>:  movl   0x28(%rbp), %eax
    0x7fff518d9377 <+7>:  movl   0x18(%rbp), %r10d
    0x7fff518d937b <+11>: pushq  %rax
    0x7fff518d937c <+12>: pushq  0x20(%rbp)
    0x7fff518d937f <+15>: pushq  %r10
    0x7fff518d9381 <+17>: pushq  0x10(%rbp)
    0x7fff518d9384 <+20>: callq  0x7fff51adf410            ; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded> of Swift._assertionFailure(_: Swift.StaticString, _: Swift.String, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never
->  0x7fff518d9389 <+25>: addq   $0x20, %rsp
    0x7fff518d938d <+29>: ud2    
    0x7fff518d938f <+31>: nop

让我感到奇怪的是,我没有更改工作代码,但现在我突然遇到了这个问题。重新启动 XCode 不会解决它。尝试了不同的方法来解决问题,但我找不到 balanceValue 应该为零的原因。非常感谢任何帮助。

【问题讨论】:

你能发送该文件的完整代码吗... 能不能加个断点,看看updateBalanceLabel函数中balanceValue的值是多少? 尝试检查balanceLabel@IBOutlet 连接到情节提要 @Rob 我不知道如何使用断点。但我在错误行之前添加了一个打印:'func updateBalanceLabel() print(balanceValue) balanceLabel.text = String(balanceValue) ' 它打印 111 这是控制台:111 '致命错误:在隐式展开可选值时意外发现 nil:文件 /Users/roman/Desktop/vToken/vToken/ViewController.swift,第 87 行 2020-01- 28 13:30:18.234060+0700 vToken[5719:617245] 致命错误:在隐式展开可选值时意外发现 nil:文件 /Users/roman/Desktop/vToken/vToken/ViewController.swift,第 87 行(lldb)' 【参考方案1】:

检查balanceLabel 是否为零,balanceValue 不是可选的,因此您得到的错误仅是由于balanceLabel。使用吹法


func updateBalanceLabel() 

     guard let label = self.balanceLabel else
       print("balanceLabel found nill ")
       return 
   
    label.text = String(balanceValue)




如果您收到balanceLabel found nill,则执行此操作后,您应该检查插座并将其连接到情节提要中的 UILabel。

【讨论】:

你是对的。它打印: tierLabel found nill 重新连接网点没有帮助。 然后通过单击 balanceLabel + ctrl 前面的圆圈将您的插座连接到 UILabel 并拖动到情节提要中的 UILabel【参考方案2】:

它是nil,因为您的插座坏了。由于您将其声明为隐式展开的可选项,因此balanceLabel.text = String(balanceValue)balanceLabel!.text = String(balanceValue) 相同。您可以通过简单地使用可选展开来验证这是真的(隐式展开的可选仍然是可选的):balanceLabel?.text = String(balanceValue)。进入故事板,右键单击标签并查看连接。断开所有现有连接,然后重新创建与变量的绑定。

【讨论】:

谢谢。正如你所说。一旦我添加了?到balannceLabel?.text,错误跳转到下一个函数。最后我不得不添加?到所有功能。打破和重新创建对变量的绑定对我没有任何作用。现在的问题仍然是为什么它突然发生。首先,它按照我编写的方式运行良好。

以上是关于问题:我的非可选变量为零。 (展开时出现致命错误)的主要内容,如果未能解决你的问题,请参考以下文章

重新加载表数据时出现致命错误:展开为零:需要帮助

检查 nil 的非可选值

Swift 中的非英文字符给出:致命错误:在展开可选值时意外发现 nil

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

使用 Swift 和 Parse 获取 Facebook UserData 时出现致命错误

不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil