swift2 是否有办法在Swift中重载operator!以避免在生产构建中崩溃?

jtoj6r0c  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(177)

如果存在nil,强制展开会导致应用程序崩溃。这在应用程序的开发阶段非常酷。但这对于您的产品构建来说是一个令人头痛的问题,特别是如果您懒得做if let nil检查的话。
是否有人尝试过任何操作符重载/重写来阻止生产构建的这些崩溃?

332nm8kg

332nm8kg1#

不,过去没有,现在没有,也永远不应该有。
Swift语言的实现者特意设计了强制展开操作符(!)来崩溃。
这是设计的
当遇到nil且无法安全处理时,有两种方法可以继续:
1.允许程序在不一致的状态下继续运行,并允许其以未定义的、不可预见的方式运行。

1.使程序崩溃,防止它在不一致、未定义、不可预见的状态下继续运行。这将保护您的文件系统、数据库、Web服务等免遭永久性损坏。
你认为这两个选项中哪一个更有意义?

cu6pst1q

cu6pst1q2#

老实说,如果我不得不维护一个代码库,如果可能的话,我会挖出我的眼睛。Swift提供了一个简单的方法来解决你因为懒惰而积极避免的问题(可选)。您可能会在这些变量周围设置一个保护,但是它需要和使用iflet语句一样多的努力。我建议的解决方案是停止懒惰,正确地使用语言。仔细检查你的代码库并修复这个问题,从长远来看,这将为你节省更多的时间。

bksxznpy

bksxznpy3#

不能重载!因为它是保留的,但是我们可以使用️

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!

请不要在实际生产中使用它。这只是给予一个如何完成它的想法,而不是它应该

相关问题