如果存在nil,强制展开会导致应用程序崩溃。这在应用程序的开发阶段非常酷。但这对于您的产品构建来说是一个令人头痛的问题,特别是如果您懒得做if let nil检查的话。是否有人尝试过任何操作符重载/重写来阻止生产构建的这些崩溃?
332nm8kg1#
不,过去没有,现在没有,也永远不应该有。Swift语言的实现者特意设计了强制展开操作符(!)来崩溃。这是设计的当遇到nil且无法安全处理时,有两种方法可以继续:1.允许程序在不一致的状态下继续运行,并允许其以未定义的、不可预见的方式运行。
!
nil
或
1.使程序崩溃,防止它在不一致、未定义、不可预见的状态下继续运行。这将保护您的文件系统、数据库、Web服务等免遭永久性损坏。你认为这两个选项中哪一个更有意义?
cu6pst1q2#
老实说,如果我不得不维护一个代码库,如果可能的话,我会挖出我的眼睛。Swift提供了一个简单的方法来解决你因为懒惰而积极避免的问题(可选)。您可能会在这些变量周围设置一个保护,但是它需要和使用iflet语句一样多的努力。我建议的解决方案是停止懒惰,正确地使用语言。仔细检查你的代码库并修复这个问题,从长远来看,这将为你节省更多的时间。
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!
请不要在实际生产中使用它。这只是给予一个如何完成它的想法,而不是它应该
3条答案
按热度按时间332nm8kg1#
不,过去没有,现在没有,也永远不应该有。
Swift语言的实现者特意设计了强制展开操作符(
!
)来崩溃。这是设计的
当遇到
nil
且无法安全处理时,有两种方法可以继续:1.允许程序在不一致的状态下继续运行,并允许其以未定义的、不可预见的方式运行。
或
1.使程序崩溃,防止它在不一致、未定义、不可预见的状态下继续运行。这将保护您的文件系统、数据库、Web服务等免遭永久性损坏。
你认为这两个选项中哪一个更有意义?
cu6pst1q2#
老实说,如果我不得不维护一个代码库,如果可能的话,我会挖出我的眼睛。Swift提供了一个简单的方法来解决你因为懒惰而积极避免的问题(可选)。您可能会在这些变量周围设置一个保护,但是它需要和使用iflet语句一样多的努力。我建议的解决方案是停止懒惰,正确地使用语言。仔细检查你的代码库并修复这个问题,从长远来看,这将为你节省更多的时间。
bksxznpy3#
不能重载!因为它是保留的,但是我们可以使用️
请不要在实际生产中使用它。这只是给予一个如何完成它的想法,而不是它应该