“致命错误:意外发现 nil 值时解包”是什么意思?


正如您在编写代码时经常看到的那样,这个错误非常常见。别担心,您将在本文中详细了解此错误。

在深入探讨此错误的原因之前,让我们先了解 Swift 中的可选值。

可选值

最初,当我们从其他来源(例如后端服务器)接收值时,它可能包含有效值或根本没有任何值。在这种情况下,您可以使用可选值,它表示具有两种可能情况的变量:值或根本没有值。

var possibleNumber = "450"
var convertedNumber = Int(possibleNumber)

在上例中,有一个输入字符串,我们将其转换为 Int。但是,此字符串可能是也可能不是有效的整数。在这种情况下,一旦我们使用 Int() 函数将此字符串转换为整数,它将返回一个可选整数。这意味着输出可以是 nil 或有效的整数。

在 Swift 中,可选值是一种可以保存值或 nil 的类型,nil 表示没有值。可选值用于处理可能不存在值的情况。

此错误的原因?

要访问可选值的值,您可以使用感叹号 (!) 运算符对其进行解包。但是,如果您尝试解包值为 nil 的可选值,它将触发运行时错误。此错误通常是由代码中的错误引起的。此错误尝试解包尚未正确初始化或已设置为 nil 的可选值。

如何修复?

要修复此错误,您需要找到 nil 可选值的来源,并确保在尝试解包之前用非 nil 值正确初始化它。或者,您可以使用可选绑定或 nil 合并运算符 (??) 安全地解包可选值,并在其为 nil 时提供默认值。

示例

var optionalMessage: String?

// This will trigger the "Unexpectedly found nil" error

// let unwrappedMessage = optionalMessage!

// Use optional binding to safely unwrap the optional and assign its
value to a constant
if let message = optionalMessage {
   print("message found: \(message)")
} else {
   print("message not found as it might be nil")
}

// Use the nil-coalescing operator to provide a default value if optionalMessage is nil
let unwrappedMessage = optionalMessage ?? "NA"
print(unwrappedMessage)

输出

message not found as it might be nil
unwrappedMessage: NA

结论

此错误很容易处理。但是,始终建议使用可选绑定从可选变量中解包值以安全地检索值。

养成避免在代码中使用强制解包的习惯。当您非常确定可选变量时,可以使用强制解包。无论如何,可选绑定或 nil 合并运算符始终是不错的选择。

更新于:2023年1月2日

4K+ 次浏览

启动您的 职业生涯

完成课程获得认证

开始
广告