“致命錯誤:意外發現 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+ 次瀏覽

啟動您的 職業生涯

完成課程獲得認證

開始
廣告