- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在用 Swift 编写一个程序,它具有各种函数,应该总是返回值,但在某些情况下不能,因此程序崩溃并警告用户错误。为了实现这一点,我使用隐式解包的 Optionals 作为我的函数的返回值,这样错误情况就可以只返回 nil(即使永远不会到达该代码)。它看起来像这样:
func giveMeAThing() -> Thing! {
if !possibleErrorCase() {
var thing = createAThingForSure()
return thing
}
else {
crashAndBurn()
return nil
}
}
写这个,感觉有点hacky,所以我的问题是这是否是在Swift中隐式解包Optionals的好用法。有没有更好的方法来构建我的代码来避免这种情况?
最佳答案
您可能缺少的拼图是@noreturn
。如果您将函数声明为 @noreturn
,如果您不履行周围的契约(Contract),编译器将放弃任何投诉。因此你可以调用这样的方法并且不返回任何值,编译器也不会提示,因为它知道我们无论如何都会死。例如,fatalError
和 abort
就是这样声明的。
因此,以下是合法的:
func f() -> String {
fatalError("oooooops")
}
即使我们未能履行返回值的契约,它也会编译,因为 @noreturn
(在 fatalError
的声明中)撕毁契约并刷新碎片下厕所。
解决同一问题的另一种可能方法是使用 assert
。如果不满足条件,这会为您崩溃和燃烧。因此,在您的示例中:
func giveMeAThing() -> Thing {
assert(!possibleErrorCase(), "gaaaaah!") // crash and burn if error case
return createAThingForSure()
}
缺点是默认情况下所有断言都会在发布的应用程序中成功。但这在开发过程中非常有用,毕竟您的交付应用程序无论如何都不应该崩溃和燃烧。
关于swift - 返回一个隐式解包的可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992323/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!