簡體   English   中英

有沒有辦法重載運算符! 在 Swift 中避免在生產構建中崩潰?

[英]Is there a way to overload operator ! in Swift to avoid crash in production builds?

如果存在 nil,強制解包會導致您的應用程序崩潰。 這在應用程序的開發階段非常酷。 但是,如果您懶得執行 if let nil 檢查,這對於您的生產構建尤其令人頭疼。

有沒有人嘗試過任何操作員重載/覆蓋來阻止生產構建的這些崩潰?

不,沒有,沒有,也不應該有。

崩潰是故意的 Swift 語言的實現者特意設計了強制解包運算符 ( ! ) 以使其崩潰。

這是設計使然

當遇到nil並且沒有安全處理時,有兩種處理方式:

  1. 允許程序以不一致的狀態繼續運行,並允許它以未定義、不可預見的方式運行。

或者

  1. 使程序崩潰,防止它以不一致的、未定義的、不可預見的狀態繼續運行。 這將保護您的文件系統、數據庫、Web 服務等免受永久性損壞。

您認為這兩個選項中哪個更有意義?

老實說,如果可能的話,我必須維護一個使用類似內容的代碼庫,我會睜大眼睛。 Swift 提供了一種簡單的方法來解決您由於懶惰(可選)而積極避免的問題。 您可能可以對這些變量進行保護,但它需要與使用 if let 語句相同的工作量。 我建議的解決方案是停止懶惰並正確使用語言。 檢查您的代碼庫並修復此問題,從長遠來看,它將為您節省更多時間。

不能超載! 既然是預定的,但是我們可以用❗️

protocol Bangable {
    init()
}

postfix operator ❗️
postfix func ❗️<T: Bangable>(value: T?) -> T {
    #if DEBUG
    value!
    #else
    value ?? T.init()
    #endif
}

extension String: Bangable {}
extension Int: Bangable {}

let bangable: Int? = 8
let cantBangOnDebug: Int? = nil
print(bangable❗️) // 8
print(cantBangOnDebug❗️) // Crashes on Debug!

請不要在生產中實際使用它。 這只是給出一個關於如何實現的想法,而不是它應該

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM