问题:我的非可选变量为零。 (展开时出现致命错误)
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,错误跳转到下一个函数。最后我不得不添加?到所有功能。打破和重新创建对变量的绑定对我没有任何作用。现在的问题仍然是为什么它突然发生。首先,它按照我编写的方式运行良好。以上是关于问题:我的非可选变量为零。 (展开时出现致命错误)的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的非英文字符给出:致命错误:在展开可选值时意外发现 nil
命中致命错误:在展开可选值 (lldb) 时意外发现 nil