【发布时间】:2015-01-16 20:32:39
【问题描述】:
我正在用 Swift 编写一个程序,它具有各种应该总是返回值的函数,但在某些情况下不能,因此程序崩溃并提醒用户错误。为了实现这一点,我使用隐式展开的 Optionals 作为函数的返回值,这样错误情况就可以返回 nil(即使永远不会到达该代码)。它看起来像这样:
func giveMeAThing() -> Thing! {
if !possibleErrorCase() {
var thing = createAThingForSure()
return thing
}
else {
crashAndBurn()
return nil
}
}
写这个,感觉有点hacky,所以我的问题是这是否是Swift中隐式解包Optionals的一个很好的使用。有没有更好的方法来构建我的代码以避免这种情况?
【问题讨论】:
-
如果
giveMeAThing真的应该总是返回Thing,那么方法原型(和返回值)应该表明(Thing与Thing!) Swift 的主要优势之一是可选,放弃该合同是很少做的事情,如果有的话。此外,如果您跟随 Apple 的发展,他们会逐渐远离使用隐式展开的可选项,除非 Objective-C 接口绝对需要。如果某事应该始终是一个事物,那么它应该被声明为这样。如果某事物可能是事物,则应将其声明为事物?新代码不应该使用Thing! -
这也是我的直觉(我知道是否可以返回 nil,它不应该被隐式解包),但编译器显然不会忽略我遗漏回报的事实。隐式展开的 Optional 对我来说总是很难看。
-
查看 matts 答案,声明它返回
Thing并使用assert(或类似的东西)来处理“这永远不会发生”的情况。 -
是的,
fatalError是我需要的,所以我使用它实现了这个功能。