抛出异常后如何避免返回可选项?

时间:2015-12-02 11:26:39

标签: swift exception optional

我正在编写一个带有参数的实用程序函数,总是返回有效的非nil 结果(注意返回的值不是可选的,因为可能的参数是所有实际上都是硬编码和有效的,所以我知道函数不能失败):

func myFunction(param: String) -> NonTrivialObject {...}

现在,在开发过程中我想尝试可能的参数,如果我犯了错误,我希望函数抛出异常而崩溃。我不想或不需要抛出Swift错误或捕获它们,我想硬崩溃并立即修复参数。在Objective C中,我只使用NSParameterAssert()或者沿着这些方向做点什么:

guard let validatedParam = param where param != nil else {
    NSException(...).raise()
    return nil
}
// do the actual work and return a non-optional result

但是,我无法返回nil,因为结果不是可选的。有没有办法以某种方式告诉编译器在抛出异常后它不需要在函数中返回任何东西?或者我注定要使用解包选项或try!语句来丢弃我的代码,或者为了让编译器满意而返回一个虚拟对象?

3 个答案:

答案 0 :(得分:2)

一个可选项可能包含nil,但Swift语法强制你使用?安全地处理它?语法,用于向编译器指示您理解行为并将安全地处理它。

答案 1 :(得分:2)

您可以使用Swift assert(_:_file:line:)功能,如下所示

assert(some condition, "Message to display if condition is false (optional)" )

如果条件已经过验证,应用程序将继续运行,否则将终止

答案 2 :(得分:0)

您可以将函数定义为投掷函数:

func foo(param: String) throws -> NonTrivialObject {
    guard param != nil else {
        throw SomeErrorEnum.NilFound
    }
    doStuff(...)
}

错误枚举需要符合ErrorType协议。函数调用现在能够捕获这样的错误:

do {
    try foo(param)
} catch SomeErrorEnum.NilFound {
    print("Found nil")
}

通过这种方式,该函数返回一个非可选的但也可以抛出错误。有关详细信息,请参阅:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html